人脸识别是一个应用场景很广阔的技术,可以用在安全门岗的闸机、图片检索、视频检索等多个领域,这里介绍如何在Visual studio 环境下使用OpenCV 3.0从摄像头中进行人脸识别并将人脸照片保存起来。
1创建一个C++控制台工程,将OpenCV 3.0的相关依赖包和执行库设置到工程的环境中,使得我们的C++工程可以调用OpenCV 3.0的相关库。具体的opencv+visual studio 2018的工程环境配置请参考一下经验链接。
2在工程中引入OpenCV库,并定义相关的namespace#include #include #include #include #include #include #include using namespace std;using namespace cv;
4打开本地的摄像头,获取图像帧,进行人脸识别1)定义一个摄像头窗口namedWindow('摄像头', CV_WINDOW_AUTOSIZE);2)打开摄像头 VideoCapture capture(0);//打开摄像头3)循环读取视频帧,每帧之间需要有时延while (capture.read(frame)) { imshow('摄像头', frame); //必须加时延,否则无法显示图像 char key = waitKey(30);}
5对视频的每帧图像进行人脸识别,识别到人脸后将人脸区域作为图像保存到本地while (capture.read(frame)) { //图像变灰 cvtColor(frame, gray, COLOR_RGB2GRAY); equalizeHist(gray, gray); faceCascader.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30)); for (size_t faceSize=0;faceSize(faceSize)].x; roi.y = faces[static_cast(faceSize)].y; roi.width = faces[static_cast(faceSize)].width; roi.height = faces[static_cast(faceSize)].height ; Mat faceROI = frame(roi); //在人脸区域画一个矩形 rectangle(frame, faces[static_cast(faceSize)], Scalar(0, 0, 255), 2, 8, 0); sn++; //将sn整型值转为字符串 stringstream stream; stream << sn; //生产一个新的文件名 String snStr = 'F:\\mm\\1\\img-' + stream.str() + '.jpg'; cout << snStr << endl; imwrite(snStr, faceROI); } imshow('摄像头', frame); //必须加时延,否则无法显示图像 char key = waitKey(30); //按ESC键退出 if (key == 27) { break; } }
6进行测试,看看测试结果中是否有保存的人脸识别图片1)运行程序2)程序驱动后,会打开摄像头3)人脸对着摄像头4)程序自动循环识别每帧的人脸部分5)将人脸部分保存到本地
7完整代码:#include #include #include #include #include #include #include using namespace std;using namespace cv;//人脸识别void faceTest(){ String facefile = 'E:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml'; //脸部识别分类器 CascadeClassifier faceCascader; if (!faceCascader.load(facefile)) { printf('无法加载脸部特征文件:%s',facefile); return; } namedWindow('摄像头', CV_WINDOW_AUTOSIZE); VideoCapture capture(0);//打开摄像头 Mat frame; Mat gray; vector faces; int sn = 0; //实时读取摄像头的图像帧 while (capture.read(frame)) { //图像变灰 cvtColor(frame, gray, COLOR_RGB2GRAY); equalizeHist(gray, gray); faceCascader.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30)); for (size_t faceSize=0;faceSize(faceSize)].x; roi.y = faces[static_cast(faceSize)].y; roi.width = faces[static_cast(faceSize)].width; roi.height = faces[static_cast(faceSize)].height ; Mat faceROI = frame(roi); //在人脸区域画一个矩形 rectangle(frame, faces[static_cast(faceSize)], Scalar(0, 0, 255), 2, 8, 0); sn++; //将sn整型值转为字符串 stringstream stream; stream << sn; //生产一个新的文件名 String snStr = 'F:\\mm\\1\\img-' + stream.str() + '.jpg'; cout << snStr << endl; imwrite(snStr, faceROI); } imshow('摄像头', frame); //必须加时延,否则无法显示图像 char key = waitKey(30); //按ESC键退出 if (key == 27) { break; } }}int main(){ faceTest(); waitKey(0); return 0;}