2015年10月24日 星期六

OpenCV 2.4 的人臉偵測(Face Detection)– cvHaarDetectObjects 函數

OpenCV 2.4 的人臉偵測(Face Detection)– cvHaarDetectObjects 函數: 

現在當大家使用數碼相機拍攝人像時,都會用到人臉偵測技術,在數碼相機對焦一群人時,焦點都會落在每個人臉上,快門按下,拍攝出來的相片都是清晰人臉,不會出現有失焦的情況。在 OpenCV 內已經具有 Face Detection 函數,人臉檢測(Face Detection)是一種在任意數字圖像中找到人臉的位置和大小的計算機技術,其實 Face Detection 基本原理是先做 Feature Extraction,接著做 Cascade Detection,擷取圖像特徵 (Feature Extraction),偵測檢查特徵,並處理特徵辨識的部位,當然就是眼睛、鼻子和嘴巴。

OpenCV 2.4 的人臉偵測(Face Detection
其中函數 cvHaarDetectObjects 使用針對某目標物體訓練的級聯分類器在圖像中找到包含目標物體的矩形區域,並且將這些區域作為一序列的矩形框返回。函數以不同比例大小的掃描視窗對圖像進行幾次搜索。每次都要對圖像中的這些重疊區域利用 cvRunHaarClassifierCascade 進行檢測。有時候也會利用某些繼承(heuristics)技術以減少分析的候選區域,例如利用 Canny 裁減(pruning)方法。函數在處理和收集到候選的方框(全部通過級聯分類器各層的區域)科之後,接著對這些區域進行組合並且返回一系列各個足夠大的組合中的平均矩形。調節程式中的缺省參數(scale_factor=1.1, min_neighbors=3, flags=0)用於對目標進行更精確同時也是耗時較長的進一步檢測。為了能對視頻圖像進行更快的即時檢測,參數設置通常是:scale_factor=1.2min_neighbors=2flags=CV_HAAR_DO_CANNY_PRUNINGmin_size = 

cvHaarDetectObjects 函數:
cvHaarDetectObjects(const CvArr* image, CvHaarClassifierCascade* cascade,
                               CvMemStorage* storage, double scale_factor=1.1,
                               int min_neighbors=3, int flags=0,
                               CvSize min_size=cvSize(0,0) );

參數說明如下:
1image = 表示要偵測的圖片。 
2cascade = 要使用的分類器,在第一個步驟所載入的分類器。 
3storage = 偵測到的物件所儲存的記憶體區塊。 
4scale_factor = 搜索視窗成長比率。 
5min_neighbors = 最少鄰近偵測視窗。一個臉可能重複偵測好幾次,但我們只要取一次,如果設 0 的話,所有偵測的視窗都會畫出來。
6flag = 演算法模式。 
7min_size = 檢測視窗的最小尺寸。因為 AdaBoost 的演算法,分成搜索視窗和檢測視窗兩個部分,搜索視窗在整個影像中移動,檢測視窗在搜索視窗中移動並計算特徵值。當檢測視窗越小,則計算特徵值的單位就越小,需要的運算量就越高,但是結果不一定會更為精確。 

簡單介紹與描述:  
Frontal Face stump        24x24, 20x20gentle, 20x20tree 
Profile Face                    20x20 
Frontal eyes (both eyes)    25*1
Frontal eyes (both eyes)    25*15
Right Eye               18x12 
Left Eye                  18x12 
Frontal Eyes           22x5 
Mouth                      25x15 
Nose                       25x15
righteye_2splits     20x20
lefteye_2splits       20x20

cvHaarDetectObjects函數
人臉訓練集(haarcascade_frontalface_default.xml):
使用 Cascade Adaboost 分類器作為學習機制,OpenCV 的分類器會放在 C:\OpenCV2.4\opencv\data\haarcascades 內,而分類器中的級聯是指最終的分類器是由幾個簡單分類器級聯組成。在圖像檢測中,被檢視窗依次通過每一級分類器,這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。目前支持這種分類器的 boosting 技術有四種:Discrete AdaboostReal AdaboostGentle Adaboost and Logitboostboosted 即指級聯分類器的每一層都可以從中選取一個 boosting 演算法(權重投票),並利用基礎分類器的自我訓練得到。

人臉訓練集(haarcascade_frontalface_default.xml
下面的範例程式裡面,使用了 Haar feature做為辨識特徵,使用 Cascade Adaboost 分類器作為學習機制。這個範例程式是 OpenCV 安裝完以後附帶範例的簡化版本。

人臉偵測(Face Detection)程式:
// 人臉偵測(Face Detection)程式
// cvHaarDetectObjects 函數
// 使用 haarcascade_frontalface_default.xml 分類器

// 讀取 Cascade 分類器
if (!cascade){
     storage=cvCreateMemStorage(0); // 建立一個指定大小的記憶體區塊 0=64k
     cvFirstType();
     file_name="C:\\haarcascade_frontalface_alt.xml"; // 分類器
     cascade = (CvHaarClassifierCascade*)cvLoad(file_name);
     cvClearMemStorage(storage);
     }

// 設定圖像
image = frame;

// 偵測人臉
faces = cvHaarDetectObjects( image, cascade, storage, 1.1, 2,
CV_HAAR_DO_CANNY_PRUNING,cvSize(20, 10));

// 偵測到的人臉和框
if (faces){
     for(i=0;itotal; ++i ){
           CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
           pt1.x = r->x;
           pt2.x = (r->x+r->width);
           pt1.y = r->y;
           pt2.y = (r->y+r->height);
           cvRectangle( image, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
           }
}

// 畫出偵測到的人臉框
pictureBox2->Image  = gcnew System::Drawing::Bitmap(frame->width,frame->height,
frame->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,
(System::IntPtr) image->imageData);
pictureBox2->Refresh();

操作系統:Windows XP 32-bit 
操作環境:Windows Visual Studio 2010 + OpenCV 2.4.8

相關網址:
※ 在 Windows XP Visual Studio 2010 安裝 OpenCV 2.4
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 第一個程式
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 使用 WebCam
※ 在 Windows XP Visual Studio 2010 安裝使用 FFmpeg 函數庫
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 使用 WebCam
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 顯示 IPCam 串流視頻
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 導入屬性工作表文件檔
※ 在 Windows XP Visual Studio 2010 使用 Windows From OpenCV 2.4 配置
※ 在 OpenCV 2.4 的 IplImage 資料結構
※ OpenCV 2.4 的坎尼圖像邊緣檢測(Canny Edge Detection) – Canny 函數
※ OpenCV 2.4 的霍夫直線偵測轉換 – HoughLines 函數
※ OpenCV 2.4 的霍夫直線偵測轉換 – HoughLinesP 函數
※ OpenCV 2.4 的人臉偵測(Face Detection)– cvHaarDetectObjects 函數
※ OpenCV 2.4 的物件偵測(Object Detection)– cvHoughCircles 函數
※ OpenCV 2.4 的物件追蹤(Object Tracking)– cvMoments 函數

參考網址:
※ Face Detection using OpenCV

2015 年 10月 24日 天氣報告
氣溫:26.4@ 23:20
相對濕度:百分之 91%
天氣:多雲

沒有留言:

張貼留言