Pages

2010年4月22日 星期四

利用 OpenCV 做人臉偵測

OpenCV 有提供人臉偵測的範例、以及 training model (.xml)。在稍作修改後,整個人臉偵測的流程如下:##ReadMore##
  1. 載入 model
    (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml");
  2. 對來源影像作 down-scale
    pyramidImg = cvCreateImage(cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3);
    cvPyrDown(image, pyramidImg, CV_GAUSSIAN_5x5);
    scale = 2;
  3. 偵測人臉
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq *faces;
    faces = cvHaarDetectObjects(pyramidImg, cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING);
  4. 將找到的人臉框出來 (or 移除)
    當偵測完畢,faces 會記錄人臉的位置,數量可能不只一個。在原先的範例,會針對每一個人臉的區域,再做偵測眼睛的動作,但我沒有這個需求,所以修改成

    • 找出最大的人臉區域:最大半徑。
    • 將它移除:避免干擾到手。
我是安裝 OpenCV2.0,裡頭的範例會使用 namespace cv,核心程式都是 object-base。執行OpenCV2.0 提供的人臉偵測時發現,CPU 使用率比舊版還高出 50% 左右,所以我就維持舊版的寫法,當然,想在 1.0、1.1 執行都沒問題,只要記得把 link library 改掉,例如:「cv200.lib -> cv.lib」。底下是執行影片:(Resolution 320x240、CPU 使用率 30%、Debug mode)




程式碼下載

參考資料
 
Blogger Templates