简单opencv人脸检测代码:LBP/Haar特征
2014-04-13 22:51
507 查看
前言
目前网络上有太多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 ; }
相关文章推荐
- 深入浅出SharePoint2010——请假系统无代码篇之工作流设计
- c语言
- php or java?choose。
- matlab中相关函数功能
- PEAR:PHP扩展与应用库
- Windows程序(C# VS 2008)杂记之智能设备项目打包CAB
- Java 文件路径相关
- PHP实现XML传输
- PHP实现XML传输
- 深入探讨 Java 类加载器
- java文件操作类实例
- CAsyncSocket编程 MFC
- C和C++中return的用法
- 【合集】【更新中】C++ pointer 之指针大乱指
- PHP解析XML
- PHP解析XML
- java类的初始化顺序
- PB动态数据管道技术实用编程
- 验证码
- Spring容器启动后自动执行Servlet进行预处理