基于MFC框架的人脸识别系统的开发

基于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
版权所有,欢迎保留原文链接进行转载:)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值