文章出處
文章列表
一、關于檢測算法
分類器訓練:
通過正樣本與負樣本訓練可得到分類器,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; }
三、檢測結果
文章列表
全站熱搜