您的位置:首页 > 运维架构

opencv学习之Adaboost算法进行人脸识别

2017-03-06 20:38 651 查看
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/objdetect/objdetect.hpp>

using namespace cv;

int main(int argc, char** argv)
{

CascadeClassifier stFaceCascade;
IplImage *pstImage = NULL;
std::vector<Rect> faceRects;

if( !stFaceCascade.load("D:\\ProgramFiles\\develop\\opencv2.4.8\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml") )
{
printf("Loading cascade error\n");
return -1;
}

pstImage = cvLoadImage("D:\\test.jpg", CV_LOAD_IMAGE_COLOR);

stFaceCascade.detectMultiScale(pstImage,
faceRects,            //检出结果
1.1,                  //缩放步长
2,                    //框融合时的最小检出个数
0|CV_HAAR_SCALE_IMAGE,//标志 |CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_DO_CANNY_PRUNING
Size(30, 30),         //最小人脸尺寸
Size(300, 300) );     //最大人脸尺寸
printf("Face Num[%d]\n", faceRects.size());

for( unsigned int j = 0; j < faceRects.size(); j++ )
{
cvRectangle(pstImage,
cvPoint(faceRects[j].x, faceRects[j].y),
cvPoint(faceRects[j].x + faceRects[j].width, faceRects[j].y + faceRects[j].height),
cvScalar(0,255,0),
2,8,0);
}
cvShowImage("FDWin", pstImage);
cvWaitKey(0);

cvReleaseImage(&pstImage);
return 0;
}


一、关于检测算法

分类器训练:

通过正样本与负样本训练可得到分类器,opencv有编译好的训练Demo,按要求训练即可生成,这里我们直接使用其已经训练好的分类器检测;

检测过程:

检测过程很简单,可以通过两种方式进行检测:

1、缩放图像:根据要检测的人脸尺寸范围对原图进行缩放,然后利用窗口(训练时正样本的尺寸),逐个遍历该尺寸下图像的所有潜在人脸位置,与分类器匹配,若通过每一级强分类器,则为人脸,若不能通过任何一级强分类器,则被判定不是人脸;

2、缩放特征:与缩放图像类似,不同的是缩放图像方式遍历的窗口是固定大小的(与正样本大小有关),图像在缩放,而缩放特征是图像不变,特征窗口在缩放;

不同点:缩放特征,积分图只需计算一次,不需要频繁缩放图像;

转载自:http://www.cnblogs.com/chenpi/p/5128232.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法
相关文章推荐