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

#include 
#include 
#include 
#include 

using namespace cv;

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

    CascadeClassifier stFaceCascade;
    IplImage *pstImage = NULL;
    std::vector 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

你可能感兴趣的:(opencv学习)