人脸识别
linux下使用Qt实现文件遍历及查找
本函数通过遍历指定目录寻找图片文件,然后搜索出含有人脸的图片,代码如下:
- //遍历目录查找
- 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;
- }