简单opencv人脸检测代码:LBP/Haar特征

前言

目前网络上有太多opencv人脸检测代码,但大部分都是用老的1.0接口,代码存在太多冗余(各种内存分配...看着太不舒服了,话说还有人用1.x版本的opencv吗- -),而实际上用2.0以上版本实现人脸检测功能是可以比较简洁的。(官方也早有相关 示例)

人脸检测代码

haar与lbp的训练结果已有现成的,在opencv安装目录的data文件夹中。(把这两个文件复制到工程目录下)
lbp比haar快非常多,识别率没去仔细评估过。
废话不多扯,上代码。(备注:这是个基于对话框的工程,就长这样)

#define HAAR_CASCADE_FRONT_FACE_PATH "haarcascade_frontalface_default.xml"//front face  haar特征方法  
#define LBP_CASCADE_FRONT_FACE_PATH "lbpcascade_frontalface.xml"//front face  LBP特征方法  
bool CfaceDlg::DetectFace( Mat& src,vector<Rect>& faceRect)
{
	static cv::CascadeClassifier face_Classifier;
	static cv::Mat src_gray;

	cv::cvtColor( src, src_gray, CV_BGR2GRAY );//灰度化
	cv::equalizeHist( src_gray, src_gray );//直方图均衡,增加对比度以提高识别率

	//load
	if (face_Classifier.empty())//check if load
	{
		if(false == face_Classifier.load(LBP_CASCADE_FRONT_FACE_PATH))
			return false;
	}

	faceRect.clear();
	//detect
	face_Classifier.detectMultiScale( src_gray, faceRect, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30, 30) );

	if(faceRect.size() == 0)
		return false;

	return true;
}


图片与视频加载代码

遇到非常多新手,读个图片/视频都要折腾半天,这里直接贴上吧。
加两个button,图片button代码:

void CfaceDlg::OnBnClickedButtonPic()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,_T("All Files(*.*)|*.*|Image File(*.jpg)|*.jpg||"),NULL);
	if(IDOK == dlg.DoModal())
	{
		USES_CONVERSION;
		string pic_path = W2A((LPCTSTR)dlg.GetPathName());

		Mat src = imread(pic_path);
		if(src.empty()) return;
		vector<Rect> faceRect;
		namedWindow("face",1);

		if(DetectFace(src,faceRect))//进行人脸识别
		{
			for (size_t faceIdx = 0;faceIdx < faceRect.size();faceIdx++)//画人脸
			{
				cv::rectangle(src,faceRect[faceIdx],cv::Scalar(10,220,240));
			}
		}
		imshow("face", src);
		waitKey();
	}
}

视频button代码:
void CfaceDlg::OnBnClickedButtonCamera()
{
	// TODO: 在此添加控件通知处理程序代码
	VideoCapture cap(0); // open the default camera
	if(!cap.isOpened())  // check if we succeeded
		return ;

	Mat src;
	namedWindow("face",1);
	for(;;)
	{
		vector<Rect> faceRect;
		cap >> src; // get a new frame from camera
		if(DetectFace(src,faceRect))
		{
			for (size_t faceIdx = 0;faceIdx < faceRect.size();faceIdx++)
			{
				cv::rectangle(src,faceRect[faceIdx],cv::Scalar(10,220,240));
			}
		}
		imshow("face", src);
		if(waitKey(30) >= 0) break;
	}
	// the camera will be deinitialized automatically in VideoCapture destructor
	cv::destroyWindow("face");
	return ;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值