之前的刚学习OpenCV的时候,对人脸识别感兴趣,觉得能够实现识别自己的脸感觉很棒。通过一段时间的学习之后,发现其实并不难。网上较多的都是PCA算法的人脸识别,这是相对来说比较老的算法了,多数的东西OpenCV都是自带的,借助该算法来学习也比较方便。
下面来具体说一下从制作样本到训练样本,再到最后调用摄像头识别自己人脸的整个过程。
1.图像的采集及预处理
要想识别指定的人,则需要将被识别人的照片做成数据集,也就是训练模型。传统获得照片的途径就是通过手机拍照、自拍。一个人需要20张不同角度和表情的照片,要实现几个人的训练模型,手机拍照显得比较麻烦,而且效果不佳,倒不如通过电脑摄像头实现。通过查阅资料,利用OpenCV写了一个拍照的小程序,并将图片提前进行了灰度处理以及中值滤波处理。然后将图片缩小到指定的120*120的大小,拍出来的照片能达到样本级的水平,省去了很多二次处理的过程。
代码如下:
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
VideoCapture cap(0);
Mat frame;
int i=0;
while (1)
{
char key = waitKey(100);
cap >> frame;
imshow("frame", frame);
Mat out;
Mat out1;
Mat out2;
cvtColor(frame, out1, CV_BGR2GRAY);//灰度化
medianBlur(out1,out,7);//中值滤波
resize(out, out2, Size(120, 120));//尺寸缩减
imshow("out", out2);
string filename = format("D:\\pic\\pic%d.jpg", i);//存入文件路径
switch (key)
{
case'p': //按'P'拍照
i++;
imwrite(filename, out2);
imshow("photo", out2);
waitKey(500);
destroyWindow("photo");
break;
default:
break;
}
}
}
这样得到的图片已经是经过处理之后的,可以当做样本使用。效果如图所示: