這是《opencv2.4.9tutorial.pdf》的objdetect module的唯一乙個例子。
在opencv中進行人臉或者人眼 或者身體的檢測 首先就是訓練好級聯分類器,然後就是檢測就行。在opencv中,「opencv/sources/data中就有內建訓練好的:基於haar特徵的級聯分類器、基於hog特徵的級聯分類器、基於lbp特徵的級聯分類器」三種。相比較來說 算haar資料夾中的分類器最多,其他兩個比如:hog的只有乙個行人檢測分類器「hogcascade_pedestrians.xml」而已;
lbp的有三個分類器:「lbpcascade_frontalface.xml」、「lbpcascade_profileface.xml」、「lbpcascade_silverware.xml」。·
採用的是級聯分類器類:cascadeclassifier,並通過不同的分類器型別進行初始化。
1、先設定不同的分類器:
這裡使用自帶的haar特徵的前人臉和眼睛級聯分類器:
string face_cascade_name = "haarcascade_frontalface_alt.xml";2、然後進行分類器類的初始化:string eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
cascadeclassifier face_cascade;cascadeclassifier eyes_cascade;
if( !face_cascade.load( face_cascade_name ) );這裡使用load()函式進行載入,當然也可以定義類的物件的時候進行初始化。load()函式的返回值是bool型別。if( !eyes_cascade.load( eyes_cascade_name ) );
當不需要該分類器可以使用cvreleasehaarclassifiercascade(&cascade);進行釋放。
3、進行物件的檢測
void cascadeclassifier::detectmultiscale(const mat& image, vector& objects, double scalefactor=1.1, int minneighbors=3, int flags=0,
size minsize=size(), size maxsize=size())
這是這個函式的原型,是用來在輸入影象中檢測不同尺寸的物件,檢測的物件將會作為乙個矩形列表,也就是原型中的第二個引數。
引數列表:需要檢測的影象(矩陣的型別為cv_8u)、矩形vector容器用來裝填所包含的檢測到的物件、在每個影象尺度上需要進行縮放的因子、候選矩形框所需要包含的鄰居大小、已經廢棄的引數、可能的物件尺寸的最小值、可能的物件的尺寸的最大值;
最後兩個引數就是用來控制範圍的,使得能夠忽略小於最小的和大於最大的;第乙個引數的要求是灰度影象,所以不能是彩色,需要進行轉換:
vector faces;mat detframe_gray;
cvtcolor( srcframe, detframe_gray, cv_bgr2gray );
equalizehist( detframe_gray, detframe_gray );
face_cascade.detectmultiscale( detframe_gray, faces, 1.1, 2, 0|cv_haar_scale_image, size(30, 30) );上面就是會自動檢測人臉然後將檢測到的人臉的個數和每個人臉的矩形區域放在faces這個容器類中。上面最後乙個最大值未指定大小,只設定了最小的物件矩形大小。
for( int i = 0; i < faces.size(); i++ )上面通過對每個人臉中,先定位好每個人臉的中心位置,然後在採用畫橢圓的方式來講人臉進行框出來,並且對每個框出來的位置進行選取roi感興趣區域來檢測眼睛。並將檢測到的眼睛用圓框出來。}
notes:不論是上面的人臉還是眼睛檢測,其中的第乙個引數都是被檢測的影象,而且在後面的畫橢圓和圓的過程中第乙個引數仍然是原影象,最後加個imshow()的函式就可以進行顯示檢測到的結果。
其中的cvround()函式的原型為 int cvround(double value);將引數轉化成與其最接近的整數。
下面這部分來自於
但是也和《opencv2.4.9refman.pdf》的448頁一樣,相信該作者也是翻譯過來的。
目前人臉檢測分類器大都是基於haar特徵利用adaboost學習演算法訓練的。
目標檢測方法最初由paul viola [viola01]提出,並由rainer lienhart [lienhart02]對這一方法進行了改善. 首先,利用樣本(大約幾百幅樣本)的 harr 特徵進行分類器訓練,得到乙個級聯的boosted分類器。訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本(例如人臉或汽車等),反例樣本指其它任意,所有的樣本都被歸一化為同樣的尺寸大小(例如,20x20)。
分類器訓練完以後,就可以應用於輸入影象中的感興趣區域(與訓練樣本相同的尺寸)的檢測。檢測到目標區域(汽車或人臉)分類器輸出為1,否則輸出為0。為了檢測整副影象,可以在影象中移動搜尋視窗,檢測每乙個位置來確定可能的目標。 為了搜尋不同大小的目標物體,分類器被設計為可以進行尺寸改變,這樣比改變待檢影象的尺寸大小更為有效。所以,為了在影象中檢測未知大小的目標物體,掃瞄程式通常需要用不同比例大小的搜尋視窗對進行幾次掃瞄。
分類器中的「級聯」是指最終的分類器是由幾個簡單分類器級聯組成。在影象檢測中,被檢視窗依次通過每一級分類器, 這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。 目前支援這種分類器的boosting技術有四種: discrete adaboost, real adaboost, gentle adaboost and logitboost。"boosted" 即指級聯分類器的每一層都可以從中選取乙個boosting演算法(權重投票),並利用基礎分類器的自我訓練得到。基礎分類器是至少有兩個葉結點的決策樹分類器。 haar特徵是基礎分類器的輸入,主要描述如下。目前的演算法主要利用下面的harr特徵。
個人:其實過程就是這樣,如果感興趣,更多的應該是使用自己訓練的分類器,在目標檢測這部分中,暫時只介紹了級聯分類器類,在《opencv2.4.9refman》中還介紹了潛在svm分類器,不過還沒有對應的例子罷了。
OpenCV學習記錄5
一 學習內容 1 兩張影象按權重相加 2 兩張影象相乘 應該可用於頻域濾波吧 二 include include using namespace std using namespace cv int main int argc,char ar if src2.data namedwindow fig...
OpenCV學習筆記5
copyimg image.copy int floodfill inputoutputarray image,inputoutputarray mask,point seedpoint,scalar newval,rect rect 0,scalar lodiff scalar scalar up...
OPENCV 5 學習筆記
opencv 5 學習筆記 線性濾波 關於濾波和模糊 濾波可分低通濾波和高通濾波兩種。而高斯濾波是指用高斯函式作為濾波函式的濾波操作,至於是不是模糊,要看是高斯低通還是高斯高通,低通就是模糊,高通就是銳化。高斯濾波是一種線性平滑濾波,適用於消除高斯雜訊,廣泛應用於影象處理的減噪過程。載入原圖 mat...