制作自己的人臉數據集
*開發環境為visual studio2010
*使用的是opencv中的Haart特征分類器,harr Cascades
*檢測對象為人臉照片
一:主要步驟
1、加載人臉檢測器
2、打開電腦攝像頭,載入視頻流,抽取幀,進行灰度化處理
3、識別人臉,采集20張保存到文件中
二 :代碼
1 /**************************************************** 2 制作自己的人臉數據集: 3 1、加載人臉檢測器 4 2、打開電腦攝像頭,載入視頻流,抽取幀,進行灰度化處理 5 3、識別人臉,采集20張保存到文件中 6 *****************************************************/ 7 #include "opencv2/objdetect.hpp" 8 #include "opencv2/videoio.hpp" 9 #include "opencv2/highgui.hpp" 10 #include "opencv2/imgproc.hpp" 11 #include <iostream> 12 #include <stdio.h> 13 #include <string.h> 14 #include <stdlib.h> 15 using namespace std; 16 using namespace cv; 17 18 int main() 19 { 20 Mat img; //用於存儲每一幀的圖像 21 Mat imgGray; //用於存儲灰度圖 22 Mat myFace; //用於存儲我的人臉數據集 23 int count=1; //圖片計數 24 CascadeClassifier cascades; //定義人臉分類器,opencv中的harr Cascades 25 cascades.load("models/lbpcascade_frontalface.xml"); //加載人臉檢測器 26 VideoCapture cap; 27 cap.open(0); //打開攝像頭 28 //cap.open("E://demo.avi"); //打開視頻 29 std::vector<Rect> faces; //定義容器存儲人臉數據 30 //循環20張人臉保存 31 while(1) 32 { 33 cap >> img; //從視頻中讀取當前幀 34 cvtColor(img,imgGray,COLOR_BGR2GRAY); //灰度化 35 //檢測出圖片中的人臉,用vector保存各個人臉的坐標、大小(用矩形表示)到faces 36 cascades.detectMultiScale(imgGray,faces, 1.1, 5,0); 37 for(size_t i = 0; i < faces.size(); i++){ 38 rectangle(img, faces[i], Scalar(0, 255, 0), 3, 8, 0); 39 } 40 //如果檢測到人臉 41 if(faces.size() == 1) 42 { 43 //如果圖片小於等於20張 44 if(count<=20) 45 { 46 Mat faceROI = imgGray(faces[0]); 47 resize(faceROI, myFace,Size(92,112));//opencv中resize()函數將識別到的人臉圖像自動改變尺寸為92x112 48 putText(img, "face_zsc", faces[0].tl(), FONT_HERSHEY_DUPLEX, 1.2, Scalar(71, 99, 255), 2, LINE_8); 49 string filename = format("faces/myface/%d.jpg", count); //保存到此文件 50 imwrite(filename, myFace); //通過imwrite函數將resize()過后的圖片保存到背景數據 51 imshow(filename,myFace); 52 waitKey(100); 53 destroyWindow(filename); 54 count++; 55 } 56 } 57 imshow("frame",img); 58 waitKey(100); 59 60 } 61 return 0; 62 system("pause"); 63 }
三 : 制作結果