翻譯:Mastering OpenCV with Practical Computer Vision Projects(第8章)(二)

來源:互聯網
上載者:User

標籤:opencv   臉部偵測   Face Service   opencv2.4.9   

/******************************************************************************************************************************************************************************************翻譯:Mastering 請接著上一篇:OpenCV with Practical Computer Vision Projects(第8章)(一)繼續閱讀

                                                                 歡迎轉載!請註明出處

***********************************************************************************************************************************/

         相比於人類可以通過比較臉部的不同來有效區分不同的人,基於Haar和LBP特徵的檢測器可以通過訓練進而從大量的人臉映像中尋找出指定人臉,這些訓練的資訊一般儲存在XML檔案中,後面將會用到。對於分類器的訓練,一般至少需要1000張正臉照和1000張非臉部的照片,比如樹葉、車、文本之類的。訓練的過程可能會很耗時,在一個雙核電腦上,一般LBP分類器需要訓練幾個小時,而Haar分類器可能需要一周。幸運的是,OpenCV中已經包含了一些預先訓練好的分類器供我們使用!我們可以選擇Haar或LBP的,不同目標特徵的分類器,去檢測正臉、側臉,眼睛、鼻子和嘴巴,我們僅需要根據需求載入不同的XML檔案即可。

        使用OpenCV執行臉部偵測

        上文已經提到,在OpenCV2.4之後,發行版中已經包含許多已經訓練好的分類器,他們以XML檔案形式儲存,我們可以根據不同的意圖選擇不同的XML檔案。下面的表格中列出了一些常用的XML檔案:


擴充:目前最新的OpenCV2.4.9版本中的預分類器已經有好多了,他們處在檔案目錄D:\OpenCV-4.9\opencv\sources\data下:開啟后里面有三個檔案夾,分別為:haarcacsdes,LBPcacsdes和hogcacsdes。分別開啟他們,你會看到如下的資訊:(這段文字包括下面這幅圖不是原文中的)

對於我們的Face Service項目,我們希望能夠檢測出正臉,因此我們使用LBP臉部檢測器,主要因為它速度快且不受許可問題的困擾。請注意雖然OpenCV2.X版本之後庫中包含有預先訓練好的LBP臉部偵測器,但是它的精度並不高,如果你想要獲得很高的精度,那麼你可能需要重新訓練你自己的LBP檢測器或者使用Haar檢測器。
Loading a Haar or LBP detector for object or face detection在進行目標檢測之前,我們首先要做的是載入這些已經訓練好的XML檔案,我們一般通過以下方式:
<span style="font-size:18px;">CascadeClassifier faceDetector;faceDetector.load(faceCascadeFilename);</span>
這一步可以通過不同的檔案名稱載入相應的Haar或LBP檢測器,這裡經常會犯的錯誤是檔案的路徑不對,進而載入失敗,檔案的路徑不是絕對的,而是依賴你構建環境。
Detecting an object using the Haar or LBP Classifier我們載入完分類器後,我們就可以使用它檢測每一幀視頻畫面中的人臉了。但是在檢測之前我們還需要對視頻畫面做一些預先處理,主要通過以下步驟:
  1. 灰階化:臉部偵測僅是在灰階映像上進行的,因此我們需要將相機捕獲到的視訊框架進行灰階化處理。
  2. 收縮映像:臉部偵測的速度主要依賴於輸入映像的尺寸,(大映像的檢測速度很慢,而小映像的檢測速度回很快,)檢測的可靠性即使在很小的尺寸下也很好。所以我們應該收縮映像到最合適的尺寸。
  3. 長條圖均衡化:臉部偵測在低照度的情況下檢測效果不好,因此我們需要通過長條圖均衡化來提高其亮度和對比。
Grayscale color conversion我們可以使用cvtColor()函數輕鬆的實現將RGB映像轉化為灰階映像,但是這樣做的前提是我們使用的不是灰階攝像機。轉化時我們需要制定原映像的格式,一般案頭電腦捕獲的是RGB三通道映像,行動裝置捕獲的是BGRA四通道映像。因此我們的代碼中要允許三種輸入圖片形式,如下:
Mat gray;if (img.channels() == 3){cvtColor(img,gray,CV_BGR2GRAY);}else if (img.channels() == 4){cvtColor(img,gray,CV_BGRA2GRAY);}else{gray = img;}
shrinking the camera image我們可以使用resize()來將映像縮放到指定的大小,也可以按比例縮放。對於映像尺寸大於240×240像素的情況,Face Service就可以很好的使用了,因為他可以搜尋到任何尺寸大於20×20像素的人臉。下面我們將映像寬度設定為320,不管輸入時VGA網路攝影機還是高清網路攝影機。有一點需要注意,在檢測完成後要記得把檢測結果擴大到原先的尺寸,因為你是在縮放的映像中檢測的,所以結果也是縮放的。我們必須確保縮放後的映像看起來不會顯得太胖或者太瘦。比如一個800×400的映像縮放到300×200時會使得映像中的人看起來比較瘦,因此我們需要使縮放後的映像與原映像有同樣的寬高比。

const int DETECTION_WIDTH = 320;Mat smallImg;float scale = img.cols/(float) DETECTION_WIDTH;if (img.cols>DETECTION_WIDTH){int scaleHeight = cvRound(img.rows/scale);resize(img,smallImg,Size(DETECTION_WIDTH,scaleHeight));} else{smallImg = img;}
Histogram equalization

我們可以通過長條圖均衡化來提高映像的亮度和對比。有時候它會使得映像看起來比較奇怪,但是實際上,他提高了映像的亮度和對比,有助於人臉的檢測。直翻圖均衡化equalizeHist()函數的用法如下:
Mat equalizedImg;equalizeHist(inputImg,equalizedImg);

detecting the face現在我們已經完成將映像灰階化、縮放到合適尺寸以及長條圖均衡化處理,下一步我們將使用CascadeClassifier::detectMultiScale()這個函數去檢測人臉。首先我們需要向此函數傳遞一些參數,如下:
  • minFeatureSize:這個參數決定了我們檢測的人臉的最小尺寸,一般我們會設定為20×20或者30×30,當然這個值需要根據你使用的映像的尺寸來決定,如果你使用的是手機網路攝影機或是電腦的網路攝影機,這些情況下臉部一般距離網路攝影機較近,你可以將最小尺寸設定為80×80,這樣做會大大提高檢測速度。但如果你想檢測距離網路攝影機很遠的臉部,比如沙灘上的朋友,那麼你需要將這個尺寸設定為20×20.
  • searchScaleFactor:這個參數決定了可以檢測多有多少不同尺寸的臉部,一般將其設定為1.1。如果想讓檢測速度快些,可以設定為1.2,但是可能會有一些臉部會漏檢。
  • minNeighbors:這個參數表示檢測器對檢測到的人臉的把握,一般我們設定為3,但是如果你想要更可靠的檢測結果,你可以適當增大這個參數,當然有可能會有很多臉部將檢測不到。
  • flags:這個參數是讓你選擇搜尋方式,比如是否搜尋所有的臉部(這是預設模式),或者僅搜尋最大的臉部(CASCADE_FIND_BIGGEST_OBJECT)。如果僅搜尋最大的臉部,檢測速度回很快。還有一些其他參數可以使用,他們可以使得檢測速度提升一到兩成,比如CASCADE_DO_ROUGH_SEARCH或者CASCADE_SCALE_IMAGE。
函數detectMultiScale()的輸出時一個vector<Rect>,比如你檢測到連個臉部,它將輸出兩個矩形。
int flags = CASCADE_SCALE_IMAGE;Size minFeatureSize(20,20);float searchScaleFactor = 1.1f;int minNeighbors = 4;std::vector<Rect> faces;faceDetector.detectMultiScale(img,faces,searchScaleFactor,minNeighbors,flags,minFeatureSize);

原來翻譯文章寫部落格這麼費勁啊......唉,還有好多,今天先翻到這,,未完待續。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.