基于MFC框架的人脸识别系统的开发
配置环境:VS2013+OpenCV2.4.10
需要添加的头文件和源文件:cvvimage.h和cvvimage.cpp
软件界面如下:
新人可以借这个软件快速掌握单文档的开发,包括菜单、对话框以及工具条的使用等。
废话不多说,下面直接放代码:
void recognition(Mat &image)
{
Mat image_gray; //定义两个Mat变量,用于存储每一帧的图像
cvtColor(image, image_gray, CV_BGR2GRAY);//转为灰度图
equalizeHist(image_gray, image_gray);//直方图均衡化,增加对比度方便处理
CascadeClassifier eye_Classifier; //载入分类器
CascadeClassifier face_cascade; //载入分类器
//加载分类训练器,OpenCv官方文档提供的xml文档,可以直接调用
//xml文档路径 opencv\sources\data\haarcascades
if (!eye_Classifier.load("haarcascade_eye.xml")) //需要将xml文档放在自己指定的路径下
{
cout << "Load haarcascade_eye.xml failed!" << endl;
}
if (!face_cascade.load("haarcascade_frontalface_alt.xml"))
{
cout << "Load haarcascade_frontalface_alt failed!" << endl;
}
//vector 是个类模板 需要提供明确的模板实参 vector<Rect>则是个确定的类 模板的实例化
vector<Rect> eyeRect;
vector<Rect> faceRect;
//检测关于眼睛部位位置
eye_Classifier.detectMultiScale(image_gray, eyeRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t eyeIdx = 0; eyeIdx < eyeRect.size(); eyeIdx++)
{
rectangle(image, eyeRect[eyeIdx], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
//检测关于脸部位置
face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faceRect.size(); i++)
{
rectangle(image, faceRect[i], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
}
以上是我封装好的一个人脸识别的类,其中haarcascade_eye.xml和haarcascade_frontalface_alt.xml可以在D:\Program Files\opencv\opencv\sources\data\haarcascades
里面找到,你需要把这两个训练好的样本放到你的工程文件夹下,其他参数基本上不需要大改,本程序读者可以用win32控制台进行测试。
如果你想通过MFC的Picture control控件进行实时显示,这就涉及到多线程视频处理的问题,需要用到一个AfxBeginThread()的函数。
本文还涉及到L-K光流法,下面是光流法的代码:
Mat curgray; // 当前图片
Mat pregray; // 预测图片
vector<Point2f> point[2]; // point0为特征点的原来位置,point1为特征点的新位置
vector<Point2f> initPoint; // 初始化跟踪点的位置
vector<Point2f> features; // 检测的特征
int maxCount = 500; // 检测的最大特征数
double qLevel = 0.01; // 特征检测的等级
double minDist = 10.0; // 两特征点之间的最小距离
vector<uchar> status; // 跟踪特征的状态,特征的流发现为1,否则为0
vector<float> err;
bool addNewPoints()
{
return point[0].size() <= 10;
}
bool acceptTrackedPoint(int i)
{
return status[i] && ((abs(point[0][i].x - point[1][i].x) + abs(point[0][i].y - point[1][i].y)) > 2);
}
void duan_OpticalFlow(Mat &frame, Mat & result)
{
cvtColor(frame, curgray, CV_BGR2GRAY);
frame.copyTo(result);
if (addNewPoints())
{
goodFeaturesToTrack(curgray, features, maxCount, qLevel, minDist);
point[0].insert(point[0].end(), features.begin(), features.end());
initPoint.insert(initPoint.end(), features.begin(), features.end());
}
if (pregray.empty())
{
curgray.copyTo(pregray);
}
calcOpticalFlowPyrLK(pregray, curgray, point[0], point[1], status, err);
int k = 0;
for (size_t i = 0; i < point[1].size(); i++)
{
if (acceptTrackedPoint(i))
{
initPoint[k] = initPoint[i];
point[1][k++] = point[1][i];
}
}
point[1].resize(k);
initPoint.resize(k);
for (size_t i = 0; i < point[1].size(); i++)
{
line(result, initPoint[i], point[1][i], Scalar(0, 0, 255));
circle(result, point[1][i], 3, Scalar(0, 255, 0), -1);
}
swap(point[1], point[0]);
swap(pregray, curgray);
//imshow("Optical Flow Demo", result);
//waitKey(50);
}
下面是软件的测试界面:
本软件的工程文件打包已经上传到CSDN下载中:
https://download.csdn.net/download/weixin_43341380/11255075
有兴趣的可以自行下载,没有积分的也可以私信我,欢迎同行进行交流讨论。
作者:雨田
出处:https://blog.csdn.net/weixin_43341380/article/details/93493018
版权所有,欢迎保留原文链接进行转载:)