人脸识别

linux下使用Qt实现文件遍历及查找

本函数通过遍历指定目录寻找图片文件,然后搜索出含有人脸的图片,代码如下:

 

  1. //遍历目录查找
  2. void FaceDetector::detectRun(const QString &path){
  3.     //判断当前线程是否正在运行
  4.     if(!isGoing)
  5.         return;
  6.     QDir dir(path);
  7.     //若目录不存在则返回退出
  8.     if (!dir.exists())
  9.         return;
  10.     //设置过滤器(目录,文件或非上级目录)
  11.     dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
  12.     dir.setSorting(QDir::DirsFirst);
  13.     //取得目录中文件列表(包含目录)
  14.     QFileInfoList list = dir.entryInfoList();
  15.     int i=0;
  16.     do{
  17.         QFileInfo fileInfo = list.at(i);
  18.         //通知View层更新当前检索到的文件
  19.         emit detectChanged(0,trUtf8("当前文件:")+fileInfo.absoluteFilePath());
  20.         bool bisDir=fileInfo.isDir();
  21.         //判断是否为目录,如果是目录则遍历,否则当前处理文件
  22.         if(bisDir)
  23.         {
  24.             detectRun(fileInfo.filePath());
  25.         }
  26.         else{
  27.             //取得文件类型后缀
  28.             QString temp=fileInfo.suffix().toLower();
  29.             //如果是图片类型则进行处理
  30.             if(conf->imageTypeList.contains(temp)){
  31.                 //将文件名QString类型改为std::string类型
  32.                 string filename(qPrintable(fileInfo.absoluteFilePath()));
  33.                 //本函数用来搜索含有人脸的图片
  34.                 DetectObject* obj=detectImage(filename);
  35.                 //如果检测出人脸区域则通知View层
  36.                 if(obj!=NULL)
  37.                     emit detectChanged(obj,trUtf8("正在处理:")+fileInfo.absoluteFilePath());
  38.             }
  39.         }
  40.         i++;
  41.     }while(i<list.size());
  42.     return;
  43. }
  44. //识别是否包含人脸图片
  45. DetectObject* FaceDetector::detectImage(string &filename){
  46.     if(isGoing){
  47.         //读取图片
  48.         Mat img = imread(filename, 1 );
  49.         if(img.empty())
  50.             return NULL;
  51.         //定义人脸区域列表
  52.         vector<Rect> faces;
  53.         Mat gray, smallImg(img.rows, img.cols, CV_8UC1 );
  54.         //将图像转成灰度图像
  55.         cvtColor( img, gray, CV_BGR2GRAY );
  56.         //调整图像大小
  57.         resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
  58.         //直方图均衡处理
  59.         equalizeHist( smallImg, smallImg );
  60.         //检测人脸区域
  61.         cascade.detectMultiScale( smallImg, faces,
  62.                 1.1, 2, 0
  63.                 |CV_HAAR_SCALE_IMAGE,
  64.                 Size(conf->minWidth, conf->minHeight) );
  65.         if(!faces.empty()){
  66.             //将识别出的人脸区域返回
  67.             DetectObject *obj=new DetectObject;
  68.             obj->filename=trUtf8(filename.c_str());
  69.             for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++){
  70.                 QRect rect;
  71.                 rect.setX(r->x);
  72.                 rect.setY(r->y);
  73.                 rect.setWidth(r->width);
  74.                 rect.setHeight(r->height);
  75.                 obj->detectRect<<rect;
  76.             }
  77.             gray.release();
  78.             smallImg.release();
  79.             img.release();
  80.             return obj;
  81.         }
  82.         gray.release();
  83.         smallImg.release();
  84.         img.release();
  85.     }
  86.     return NULL;
  87. }

 

posted @ 2016-09-05 09:00  JeffreyCheung  阅读(839)  评论(0编辑  收藏  举报