linux下使用Qt实现文件遍历及查找
(2012-01-10 13:11:21)
标签:
opencv文件遍历查找人脸识别it |
分类: 我的算法 |
本函数通过遍历指定目录寻找图片文件,然后搜索出含有人脸的图片,代码如下:
- //遍历目录查找
-
void
FaceDetector::detectRun(const QString &path){ -
//判断当前线程是否正在运行 -
if(!isGoing) -
return; -
QDir dir(path); -
//若目录不存在则返回退出 -
if (!dir.exists()) -
return; -
//设置过滤器(目录,文件或非上级目录) -
dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot); -
dir.setSorting(QDir::DirsFirst); -
//取得目录中文件列表(包含目录) -
QFileInfoList list = dir.entryInfoList(); -
int i=0; -
do{ -
QFileInfo fileInfo = list.at(i); -
//通知View层更新当前检索到的文件 -
emit detectChanged(0,trUtf8("当前文件:")+fileInfo.absoluteFilePath()); -
bool bisDir=fileInfo.isDir(); -
//判断是否为目录,如果是目录则遍历,否则当前处理文件 -
if(bisDir) -
{ -
detectRun(fileInfo.filePath()); -
} -
else{ -
//取得文件类型后缀 -
QString temp=fileInfo.suffix().toLower(); -
//如果是图片类型则进行处理 -
if(conf->imageTypeList.contains(temp)){ -
//将文件名QString类型改为std::string类型 -
string filename(qPrintable(fileInfo.absoluteFilePath())); -
//本函数用来搜索含有人脸的图片 -
DetectObject* obj=detectImage(filename); -
//如果检测出人脸区域则通知View层 -
if(obj!=NULL) -
emit detectChanged(obj,trUtf8("正在处理:")+fileInfo.absoluteFilePath()); -
} -
} -
i++; -
}while(i<list.size()); -
return; - }
- //识别是否包含人脸图片
-
DetectObject*
FaceDetector::detectImage(string &filename){ -
if(isGoing){ -
//读取图片 -
Mat img = imread(filename, 1 ); -
if(img.empty()) -
return NULL; -
//定义人脸区域列表 -
vector<Rect> faces; -
Mat gray, smallImg(img.rows, img.cols, CV_8UC1 ); -
//将图像转成灰度图像 -
cvtColor( img, gray, CV_BGR2GRAY ); -
//调整图像大小 -
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); -
//直方图均衡处理 -
equalizeHist( smallImg, smallImg ); -
//检测人脸区域 -
cascade.detectMultiScale( smallImg, faces, -
1.1, 2, 0 -
|CV_HAAR_SCALE_IMAGE, -
Size(conf->minWidth, conf->minHeight) ); -
if(!faces.empty()){ -
//将识别出的人脸区域返回 -
DetectObject *obj=new DetectObject; -
obj->filename=trUtf8(filename.c_str()); -
for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++){ -
QRect rect; -
rect.setX(r->x); -
rect.setY(r->y); -
rect.setWidth(r->width); -
rect.setHeight(r->height); -
obj->detectRect<<rect; -
} -
gray.release(); -
smallImg.release(); -
img.release(); -
return obj; -
} -
gray.release(); -
smallImg.release(); -
img.release(); -
} -
return NULL; - }