如何使用visualStudio+OpenCV 3.0进行人脸识别
1、创建一个C++控制台工程,将OpenCV 3.0的相关依赖包和执行库设置到工程的环境中,使得我们的C++工程可以调用OpenCV 3.0的相关库。具体的opencv+visual studio 2018的工程环境配置请参考一下经验链接。
2、在工程中引入OpenCV库,并定义相关的namespace#include <opencv2/opencv.hpp>#include <opencv2/core.hpp>#include <opencv2/imgproc.hpp>#include <opencv2/highgui.hpp>#include <iostream>#include <string>#include <stdlib.h>using namespace std;using namespace cv;
3、我们使用OpenCV 3.4自身带的人脸识别训练模型数据进行人脸识别从本地加载人脸识别特征库String facefile = "E:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml"; //脸部识别分类器加载 CascadeClassifier faceCascader; if (!faceCascader.load(facefile)) { printf("无法加载脸部特征文件:%s",facefile); return; }
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<faces.size();faceSize++) { Rect roi; roi.x = faces[static_cast<int>(faceSize)].x; roi.y = faces[static_cast<int>(faceSize)].y; roi.width = faces[static_cast<int>(faceSize)].width; roi.height = faces[static_cast<int>(faceSize)].height ; Mat faceROI = frame(roi); //在人脸区域画一个矩形 rectangle(frame, faces[static_cast<int>(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 <opencv2/opencv.hpp>#include <opencv2/core.hpp>#include <opencv2/imgproc.hpp>#include <opencv2/highgui.hpp>#include <iostream>#include <string>#include <stdlib.h>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<Rect> 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<faces.size();faceSize++) { Rect roi; roi.x = faces[static_cast<int>(faceSize)].x; roi.y = faces[static_cast<int>(faceSize)].y; roi.width = faces[static_cast<int>(faceSize)].width; roi.height = faces[static_cast<int>(faceSize)].height ; Mat faceROI = frame(roi); //在人脸区域画一个矩形 rectangle(frame, faces[static_cast<int>(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;}