現在當大家使用數碼相機拍攝人像時,都會用到人臉偵測技術,在數碼相機對焦一群人時,焦點都會落在每個人臉上,快門按下,拍攝出來的相片都是清晰人臉,不會出現有失焦的情況。在 OpenCV 內已經具有 Face Detection 函數,人臉檢測(Face Detection)是一種在任意數字圖像中找到人臉的位置和大小的計算機技術,其實 Face Detection 基本原理是先做 Feature Extraction,接著做 Cascade Detection,擷取圖像特徵 (Feature Extraction),偵測檢查特徵,並處理特徵辨識的部位,當然就是眼睛、鼻子和嘴巴。
OpenCV 2.4 的人臉偵測(Face Detection) |
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) );
參數說明如下:
1‧image = 表示要偵測的圖片。 參數說明如下:
2‧cascade = 要使用的分類器,在第一個步驟所載入的分類器。
3‧storage = 偵測到的物件所儲存的記憶體區塊。
4‧scale_factor = 搜索視窗成長比率。
5‧min_neighbors = 最少鄰近偵測視窗。一個臉可能重複偵測好幾次,但我們只要取一次,如果設 0 的話,所有偵測的視窗都會畫出來。
6‧flag = 演算法模式。
7‧min_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函數 |
使用 Cascade Adaboost 分類器作為學習機制,OpenCV 的分類器會放在 C:\OpenCV2.4\opencv\data\haarcascades 內,而分類器中的級聯是指最終的分類器是由幾個簡單分類器級聯組成。在圖像檢測中,被檢視窗依次通過每一級分類器,這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。目前支持這種分類器的 boosting 技術有四種:Discrete Adaboost,Real Adaboost,Gentle Adaboost and Logitboost。boosted 即指級聯分類器的每一層都可以從中選取一個 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;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%
天氣:多雲
沒有留言:
張貼留言