Qt5.7+Opencv2.4.9人脸识别(三)人脸处理

原创 2017年05月04日 11:20:32

【注意】本博文的档次适合OpenCV初学者,和要做本科生毕业设计这类档次。

上一节是人脸采集,链接如下:

http://blog.csdn.net/qq78442761/article/details/71158472


源码的下载地址和原理理论部分请走下面连接

http://blog.csdn.net/qq78442761/article/details/71157980


本节讲解Opencv中的人脸处理,

功能如下:

当我们点击了功能里面的照片处理后,如下所示:


并且在Data目录下,可以看见生成了一个对应的文件夹,这个文件夹和peopel.txt里面的标识对应,如下图所示:


下面来看代码

void AddPeople::disposePic()
{
    file.CreateFile(QString::number( MaxNumAboutPeople,10));
    QString sourceFilePath="addData\\";
    QString targetFilePath="Data\\"+QString::number(MaxNumAboutPeople,10);
    targetFilePath.append("\\");
    QString sourceFile;
    QString targetFile;
    for(int i=0;i<10;i++)
    {
        sourceFile.append(sourceFilePath+QString::number(i+1,10));
        sourceFile.append(".jpg");
        targetFile.append(targetFilePath);
        targetFile.append(QString::number(i,10));
        targetFile.append(".jpg");
        this->detectAndDisplay(sourceFile,targetFile);
        sourceFile.clear();
        targetFile.clear();
    }
}
这是创建文件夹的代码,是不是很简单呢?其实就是调用了file.h,我们现在进入file.h和file.cpp来看看

如果创建文件夹:

void MyFILE::CreateFile(QString fileName)
{
    PicFile=new QDir;
    QString path="Data\\"+fileName;
    if(PicFile->exists(path))
    {
        QMessageBox about;
        about.setText(tr("文件夹创建失败"));
        about.exec();
    }
    else
    {
        if(PicFile->mkdir(path))
        {
            QMessageBox about;
            about.setText(tr("文件夹创建成功"));
            about.exec();
        }
    }
}

而关于存储图像和处理在detectAndDisplay(sourceFile,targetFile);这个函数中。

现在来看此函数:

void AddPeople::detectAndDisplay(QString source, QString target)
{
    std::string face_cascade_name = "haarcascade_frontalface_alt.xml";
    cv::CascadeClassifier face_cascade;   //定义人脸分类器

    cv::Mat frame = cv::imread(source.toStdString());
    if(!frame.data)
    {
        qDebug()<<source;
        QMessageBox::warning(this,tr("提示"),tr("frame读取失败"),QMessageBox::Ok);
        return;
    }
    if (!face_cascade.load(face_cascade_name))
    {
        QMessageBox::warning(this,tr("错误"),tr("haarcascade_frontalface_alt.xml加载失败"),QMessageBox::Ok);
        return;
    }
    std::vector<cv::Rect> faces;
    cv::Mat img_gray;

    cv::cvtColor(frame, img_gray, cv::COLOR_BGR2GRAY);
    cv::equalizeHist(img_gray, img_gray);

    face_cascade.detectMultiScale(img_gray, faces, 1.1, 3, CV_HAAR_DO_ROUGH_SEARCH, cv::Size(50, 50));

    for (int j = 0; j < (int)faces.size(); j++)
    {
        cv::Mat faceROI = frame(faces[j]);
        cv::Mat MyFace;
        cv::Mat gray_MyFace;
        if (faceROI.cols > 100)
        {
            cv::resize(faceROI, MyFace, cv::Size(92, 112));
            cv::cvtColor(MyFace, gray_MyFace, CV_BGR2GRAY);
            imwrite(target.toStdString(), gray_MyFace);
        }
    }
}

这里的代码说白了就是调用haarcascade找人脸,分割人脸,然后进行灰度处理,和直方图均衡化,然后进行imwrite保存文件。

进行灰度处理,和直方图均衡化是为了训练模型时减少计算,减少冗余信息对识别的影响,提供识别准确度。


10张图片处理完毕了,下面我们生成csv文件。

csv也就是逗号分割的文件,也就是说,我们有10张图,如果10个人就100张图,为了操作方便,为何不用一个文件把这些图的路径和人脸的标号放在一起,让Opencv直接读取,这样才方便。

当点击生成csv后如下图所示:

这个at.txt文件是预先创建好的。

其实功能就是把相对路径换成绝对路径,方便Opencv进行读取。这里有个坑要注意,Opencv中读取csv文件只能是ASCII编码,如果不是ASCII将读取不了,如下图所示:


现在来看代码,如何完成这样的工作:

void AddPeople::AddCSV()
{
    file.MakecsvFile();
}
在Addpeople中AddCSV调用了file.MakecsvFile,现在进去看他具体的代码:

void MyFILE::MakecsvFile()
{
    QDir csvFile("./Data/at.txt");
    QString csvPath=csvFile.absolutePath();
    QString csvFilePath=csvPath;
    csvPath.chop(6);
    QString path=csvPath+QString::number(MaxNumAboutPeople,10)+"/";
    for(int i=0;i<10;i++)
    {
        QString filepath=path;
        filepath.append(QString::number(i,10));
        filepath.append(".jpg;");
        filepath.append(QString::number(MaxNumAboutPeople,10));
        //this->AddPeople(csvFilePath,filepath);
        QFile file(csvFilePath);
        if(!file.open(QIODevice::WriteOnly|QIODevice::Append))
        {
            QMessageBox about;
            about.setText(tr("添加人员时文件打开失败"));
            about.exec();
            return;
        }
        QTextStream in(&file);
        //in.setCodec("UTF-8");
        in<<filepath<<"\r\n";
        file.close();
    }
}

是不是和上一节创建文件一样简单呢!

下一节将说明模型训练!
源码和理论部分在本博文开头有提供。



版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

【OpenCV入门指南】第十三篇 人脸检测

【OpenCV入门指南】第十三篇 人脸检测     本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别)。人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影。甚...

【OpenCV入门指南】第一篇 安装OpenCV

【OpenCV第一篇】安装OpenCV本篇主要介绍如何下载OpenCV安装程序,如何在VS2008下安装配置OpenCV,文章最后还介绍了一个使用OpenCV的简单小例子。《OpenCV入门指南》系列...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

OpenCV(2)----人脸检测

安装完OpenCV之后,目录下有很多例子代码,例子中看到了一份FaceDetect的代码,于是自己修改了下,写了一个简单的人脸检测的程序。 代码如下: #include #include ...

Qt5.7+Opencv2.4.9人脸识别(四)模型训练

Qt5.7+Opencv2.4.9人脸识别(四)模型训练

MFC中利用Opencv与C++抓取摄像头进行人脸识别(Mat)

第一次写博客哈哈,有些小激动,还请各位大神多多包涵~ 最近的项目需要用到人脸识别,作为一个车辆工程的二年级本科生是崩溃的(一是没有很好的编程基础,只会编一下C与C#;二是…我是车辆工程的啊喂…...

OpenCV 2.4+ C++ 人脸识别

机器学习 机器学习的目的是把数据转换成信息。机器学习通过从数据里提取规则或模式来把数据转成信息。   人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。每个节点...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)