級聯分類器

OpenCV支持的目標檢測的方法是利用樣本的Haar特徵進行的分類器訓練,得到的級聯boosted分類器(Cascade Classification)。注意,新版本的C++接口除了Haar特徵以外也可以使用LBP特徵。

先介紹一下相關的結構,級聯分類器的計算特徵值的基礎類FeatureEvaluator,功能包括讀操作read、複製clone、獲得特徵類型getFeatureType,分配圖片分配窗口的操作setImage、setWindow,計算有序特徵calcOrd,計算絕對特徵calcCat,創建分類器特徵的結構create函數。級聯分類器類CascadeClassifier。目標級聯矩形的分組函數groupRectangles

接下來,我嘗試使用CascadeClassifier這個級聯分類器類檢測視頻流中的目標(haar支持的目標有人臉、人眼、嘴、鼻、身體。這裏嘗試比較成熟的人臉和眼鏡)。用load函數加載XML分類器文件(目前提供的分類器包括Haar分類器和LBP分類器(LBP分類器數據較少))具體步驟如下:

這裏再補充一點:後來我又進行了一些實驗,對正面人臉分類器進行了實驗,總共有4個,alt、alt2、alt_tree、default。對比下來發現alt和alt2的效果比較好,alt_tree耗時較長,default是一個輕量級的,經常出現誤檢測。所以還是推薦大家使用haarcascade_frontalface_atl.xml和haarcascade_frontalface_atl2.xml。

1)加載級聯分類器

調用CascadeClassifier類成員函數load實現,代碼爲:

  1. CascadeClassifier face_cascade;  
  2. face_cascade.load("haarcascade_frontalface_alt.xml");  
CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_alt.xml");

2)讀取視頻流

這部分比較基礎啦~~從文件中讀取圖像序列,讀取視頻文件,讀取攝像頭視頻流看過我之前的文章,這3種方法應該瞭然於心。

3)對每一幀使用該分類器

這裏先將圖像變成灰度圖,對它應用直方圖均衡化,做一些預處理的工作。接下來檢測人臉,調用detectMultiScale函數,該函數在輸入圖像的不同尺度中檢測物體,參數image爲輸入的灰度圖像,objects爲得到被檢測物體的矩形框向量組,scaleFactor爲每一個圖像尺度中的尺度參數,默認值爲1.1,minNeighbors參數爲每一個級聯矩形應該保留的鄰近個數(沒能理解這個參數,-_-|||),默認爲3,flags對於新的分類器沒有用(但目前的haar分類器都是舊版的,CV_HAAR_DO_CANNY_PRUNING利用Canny邊緣檢測器來排除一些邊緣很少或者很多的圖像區域,CV_HAAR_SCALE_IMAGE就是按比例正常檢測,CV_HAAR_FIND_BIGGEST_OBJECT只檢測最大的物體,CV_HAAR_DO_ROUGH_SEARCH只做初略檢測),默認爲0.minSize和maxSize用來限制得到的目標區域的範圍。這裏調用的代碼如下:

  1. face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );  
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

4)顯示目標

這個也比較簡單,調用ellips函數將剛纔得到的faces矩形框都顯示出來

更進一步,也可以在得到的每一幅人臉中得到人眼的位置,調用的分類器文件爲haarcascade_eye_tree_eyeglasses.xml,先將臉部區域選爲興趣區域ROI,重複上訴步驟即可,這裏就不詳細介紹了。當然,感興趣的朋友也可以試試其他的xml文件作爲分類器玩一下啊,感覺LBP特徵雖然xml文件的大小很小,但效果還可以,不過我沒有做過多的測試。光說不練假把式,最後貼上效果圖和源代碼的下載地址


代碼下載地址:http://download.csdn.net/detail/yang_xian521/3800468

發佈了4 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章