如何使用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;
}