前言
人脸识别算法用的是Eigenface算法。 Eigenface算法原理:计算平均脸->计算协方差矩阵->计算特征值->计算特征矩阵->得到特征脸->将图片与特征脸对比识别人脸。一、对象检测初始化
定义一个CascadeClassifier对像来检测人脸,先使用load方法初始化,初始化时要用到haar的特征人脸识别分类器。
string haar_face_datapath = "C:/opencv/build/etc/haarcascades/haarcascade_frontalface_alt_tree.xml";//检测人脸
CascadeClassifier faceDetector;//CascadeClassifier对象检测
faceDetector.load(haar_face_datapath);//初始化
二、获取样本
先使用VideoCapture捕捉摄像头中的人脸,将从摄像头中得到的源图像存储到Mat格式的变量中,然后使用detectMultiScale进行多尺度目标检测,将源图像中的人脸识别出来,并用Rect类型的vector存储检测出来的人脸的矩形轮廓。
将检测出来的人脸使用resize函数,按照矩形轮廓截取,并使用imwrite保存下来。
接下来是训练和识别人脸,我将上一步检测出来的人脸,全部按照路径加人物编号的方式存储到了一个csv文件中,方便读取。
VideoCapture capture(0);//0表示打开摄像头,如果是路径表示读取视频
if (!capture.isOpened())
{
cout << "could not open camera" << endl;
return -1;
}
Mat frame;
vector<Rect> faces;//Rect矩形坐标
int count = 0;//计算人脸数
while (capture.read(frame))//read按帧读取图像,保存到frame中
{
flip(frame, frame, 1);//flip用于反转图像,参数一:原始图像,参数二:变换后的图像,参数三:反转模式,1表示水平翻转
//detectMultiScale进行多尺度目标检测,frame摄像头得出来的源图像,faces检测出的物体的边缘
faceDetector.detectMultiScale(frame, faces, 1.1,1,0,Size(100,120),Size(380,400));
for (int i = 0; i < faces.size(); i++)
{
if (count % 10 == 0)
{
Mat dst;
resize(frame(faces[i]), dst, Size(100, 100));//调整图片大小。frame(faces[i])重载"()"操作符函数
imwrite(format("C:/Users/18218/source/repos/facerecog_01/outimage/face_%d.jpg",count),dst);
}
rectangle(frame, faces[i], Scalar(0, 0, 255), 2, 8, 0);//画红色矩形框
}
imshow("camera-demo", frame);
char c = waitKey(10);//waitKey(10)表示延时10ms切换到下一帧图像
if (c == 27)//esc键对应的ASCLL码是27
break;
count++;
}
capture.release();