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

来源:互联网 发布:一维数组排序算法 php 编辑:程序博客网 时间:2024/05/29 08:05

前言

目前网络上有太多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 );//直方图均衡,增加对比度以提高识别率//loadif (face_Classifier.empty())//check if load{if(false == face_Classifier.load(LBP_CASCADE_FRONT_FACE_PATH))return false;}faceRect.clear();//detectface_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 cameraif(!cap.isOpened())  // check if we succeededreturn ;Mat src;namedWindow("face",1);for(;;){vector<Rect> faceRect;cap >> src; // get a new frame from cameraif(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 destructorcv::destroyWindow("face");return ;}
0 0
原创粉丝点击