您的位置:首页 > 编程语言

简单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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: