zoukankan      html  css  js  c++  java
  • 人脸识别

    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. }
  • 相关阅读:
    js数组
    关于编程,程序员的一些语录
    css心得
    js函数
    一些电脑基础知识
    gnome3安装
    C学习小记
    ubuntu重装系统后
    elinks文字浏览器
    快捷方式
  • 原文地址:https://www.cnblogs.com/JeffreyCheung/p/5841076.html
Copyright © 2011-2022 走看看