Qt5.7+Opencv2.4.9人脸识别(三)人脸处理
【注意】本博文的檔次適合OpenCV初學者,和要做本科生畢業(yè)設計這類檔次。
上一節(jié)是人臉采集,鏈接如下:
http://blog.csdn.net/qq78442761/article/details/71158472
源碼的下載地址和原理理論部分請走下面連接
http://blog.csdn.net/qq78442761/article/details/71157980
本節(jié)講解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();} } 這是創(chuàng)建文件夾的代碼,是不是很簡單呢?其實就是調(diào)用了file.h,我們現(xiàn)在進入file.h和file.cpp來看看如果創(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();}} }而關于存儲圖像和處理在detectAndDisplay(sourceFile,targetFile);這個函數(shù)中。
現(xiàn)在來看此函數(shù):
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);}} }這里的代碼說白了就是調(diào)用haarcascade找人臉,分割人臉,然后進行灰度處理,和直方圖均衡化,然后進行imwrite保存文件。
進行灰度處理,和直方圖均衡化是為了訓練模型時減少計算,減少冗余信息對識別的影響,提供識別準確度。
10張圖片處理完畢了,下面我們生成csv文件。
csv也就是逗號分割的文件,也就是說,我們有10張圖,如果10個人就100張圖,為了操作方便,為何不用一個文件把這些圖的路徑和人臉的標號放在一起,讓Opencv直接讀取,這樣才方便。
當點擊生成csv后如下圖所示:
這個at.txt文件是預先創(chuàng)建好的。
其實功能就是把相對路徑換成絕對路徑,方便Opencv進行讀取。這里有個坑要注意,Opencv中讀取csv文件只能是ASCII編碼,如果不是ASCII將讀取不了,如下圖所示:
現(xiàn)在來看代碼,如何完成這樣的工作:
void AddPeople::AddCSV() {file.MakecsvFile(); }在Addpeople中AddCSV調(diào)用了file.MakecsvFile,現(xià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("添加人員時文件打開失敗"));about.exec();return;}QTextStream in(&file);//in.setCodec("UTF-8");in<<filepath<<"\r\n";file.close();} }是不是和上一節(jié)創(chuàng)建文件一樣簡單呢!
下一節(jié)將說明模型訓練!
源碼和理論部分在本博文開頭有提供。
總結
以上是生活随笔為你收集整理的Qt5.7+Opencv2.4.9人脸识别(三)人脸处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 同一字段分别统计,mysql
- 下一篇: Qt5.7+Opencv2.4.9人脸识