文章出處

一、關于檢測算法

分類器訓練:

通過正樣本與負樣本訓練可得到分類器,opencv有編譯好的訓練Demo,按要求訓練即可生成,這里我們直接使用其已經訓練好的分類器檢測;

檢測過程:

檢測過程很簡單,可以通過兩種方式進行檢測:

1、縮放圖像:根據要檢測的人臉尺寸范圍對原圖進行縮放,然后利用窗口(訓練時正樣本的尺寸),逐個遍歷該尺寸下圖像的所有潛在人臉位置,與分類器匹配,若通過每一級強分類器,則為人臉,若不能通過任何一級強分類器,則被判定不是人臉;

2、縮放特征:與縮放圖像類似,不同的是縮放圖像方式遍歷的窗口是固定大小的(與正樣本大小有關),圖像在縮放,而縮放特征是圖像不變,特征窗口在縮放;

不同點:縮放特征,積分圖只需計算一次,不需要頻繁縮放圖像;

二、基于的OpenCV的檢測Demo

先利用OpenCV的接口調用一下檢測算法,測試一下,后續考慮移植其源代碼為C語言版本,個人覺得C語言版本的算法較易理解,易于閱讀;

#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;
}

三、檢測結果



 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()