Qt5.7+Opencv2.4.9人脸识别(三)人脸处理
【注意】本博文的檔次適合OpenCV初學(xué)者,和要做本科生畢業(yè)設(shè)計(jì)這類(lèi)檔次。
上一節(jié)是人臉采集,鏈接如下:
http://blog.csdn.net/qq78442761/article/details/71158472
源碼的下載地址和原理理論部分請(qǐng)走下面連接
http://blog.csdn.net/qq78442761/article/details/71157980
本節(jié)講解Opencv中的人臉處理,
功能如下:
當(dāng)我們點(diǎn)擊了功能里面的照片處理后,如下所示:
并且在Data目錄下,可以看見(jiàn)生成了一個(gè)對(duì)應(yīng)的文件夾,這個(gè)文件夾和peopel.txt里面的標(biāo)識(shí)對(duì)應(yīng),如下圖所示:
下面來(lái)看代碼
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();} } 這是創(chuàng)建文件夾的代碼,是不是很簡(jiǎn)單呢?其實(shí)就是調(diào)用了file.h,我們現(xiàn)在進(jìn)入file.h和file.cpp來(lái)看看如果創(chuàng)建文件夾:
void MyFILE::CreateFile(QString fileName) {PicFile=new QDir;QString path="Data\\"+fileName;if(PicFile->exists(path)){QMessageBox about;about.setText(tr("文件夾創(chuàng)建失敗"));about.exec();}else{if(PicFile->mkdir(path)){QMessageBox about;about.setText(tr("文件夾創(chuàng)建成功"));about.exec();}} }而關(guān)于存儲(chǔ)圖像和處理在detectAndDisplay(sourceFile,targetFile);這個(gè)函數(shù)中。
現(xiàn)在來(lái)看此函數(shù):
void AddPeople::detectAndDisplay(QString source, QString target) {std::string face_cascade_name = "haarcascade_frontalface_alt.xml";cv::CascadeClassifier face_cascade; //定義人臉?lè)诸?lèi)器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("錯(cuò)誤"),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);}} }這里的代碼說(shuō)白了就是調(diào)用haarcascade找人臉,分割人臉,然后進(jìn)行灰度處理,和直方圖均衡化,然后進(jìn)行imwrite保存文件。
進(jìn)行灰度處理,和直方圖均衡化是為了訓(xùn)練模型時(shí)減少計(jì)算,減少冗余信息對(duì)識(shí)別的影響,提供識(shí)別準(zhǔn)確度。
10張圖片處理完畢了,下面我們生成csv文件。
csv也就是逗號(hào)分割的文件,也就是說(shuō),我們有10張圖,如果10個(gè)人就100張圖,為了操作方便,為何不用一個(gè)文件把這些圖的路徑和人臉的標(biāo)號(hào)放在一起,讓Opencv直接讀取,這樣才方便。
當(dāng)點(diǎn)擊生成csv后如下圖所示:
這個(gè)at.txt文件是預(yù)先創(chuàng)建好的。
其實(shí)功能就是把相對(duì)路徑換成絕對(duì)路徑,方便Opencv進(jìn)行讀取。這里有個(gè)坑要注意,Opencv中讀取csv文件只能是ASCII編碼,如果不是ASCII將讀取不了,如下圖所示:
現(xiàn)在來(lái)看代碼,如何完成這樣的工作:
void AddPeople::AddCSV() {file.MakecsvFile(); }在Addpeople中AddCSV調(diào)用了file.MakecsvFile,現(xiàn)在進(jìn)去看他具體的代碼: 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("添加人員時(shí)文件打開(kāi)失敗"));about.exec();return;}QTextStream in(&file);//in.setCodec("UTF-8");in<<filepath<<"\r\n";file.close();} }是不是和上一節(jié)創(chuàng)建文件一樣簡(jiǎn)單呢!
下一節(jié)將說(shuō)明模型訓(xùn)練!
源碼和理論部分在本博文開(kāi)頭有提供。
總結(jié)
以上是生活随笔為你收集整理的Qt5.7+Opencv2.4.9人脸识别(三)人脸处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 同一字段分别统计,mysql
- 下一篇: C/C++ OpenCV滑动条的创建与使