人脸识别示例代码解析(二)——人脸识别解析
上一篇我們初步分析了下示例代碼facedetector的程序參數解析部分。其中參數解析的過程如下:
其中第4步黃色標注的部分cascadeName,是我們人臉識別分類器的主要參數。
在openCV中,實現了著名的haar特征檢測算法,而依托該算法分類器,我們可以實現人臉識別、定位。
該算法基于特征模板的滑動計算圖像特征,從而區分物體的顯著輪廓。
這些特征模板形似以下圖像:
試想用這些黑白二值圖像”蒙”在你的圖像或部分圖像上,然后你原來的圖像被分成“黑”“白”兩類區域,最后用黑色區域和白色區域的像素進行簡單的加減運算,便能得到圖像的基本特征。
例如,我們將模板窗口(3)“蒙”在鼻子部位,便能得到相契合的特征,將模板窗口(4)放在雙眼部位,同樣能得到與雙眼部位契合的特征。
但是如何根據不同圖像來確定特征模板窗口的大小,和它們應該放置的位置呢。比如上圖,我們怎么知道將特定大小的“上黑下白”特征模板固定在圖像的高度3/4上?
答案就是,我們讓不知勞累的計算機,測試各種位置和大小。
這是一個巨大的工作量,首先我們如果確定具體特征模板窗口大小為24,24。那么我們就得將待檢測圖像分為若干個24,24大小區域,試圖分別用不同特征模板檢測*區域圖像是否“匹配”某特征,那么單單一個窗口匹配次數是大于160000,這依然將是一個巨大的工作量。
但如果引入級聯分類器——Cascade Classifiers,那么工作量就會極大的縮減。
拿人臉檢測來講,先用一些特征,確定該區域圖像“有臉”以及“無臉“,丟掉”無臉“部分,然后再用其他特征檢測,來進一步確定特征的是否存在,以及確定其特征位置。
這個過程使得我們匹配特征的過程產生一個“級聯“的工作模式,每往下走一層,就會”丟掉“一些無關的區域,這樣特征就越來越精確。
從上述過程當中我們可以看到,單獨一個特征不能確定最終結果,而是多個特征的級聯聯合使得最終我們能夠做出一個精確的判斷。
我們把單個特征的檢測叫做弱分類器(因為它不能單獨確定最終結果),而把這些弱分類器級聯成的最終分類器成為強分類器。可見最終的強分類器是在集成算法的基礎上構建的。
好吧,言歸正傳,openCV實現了這個強分類器,用CascadeClassifier類封裝該分類器。你可以實例化該類對象,并設計一個訓練計劃,來訓練想要的特征檢測器。
對與人臉檢測來說,openCV已經幫我們訓練好了分類器,該分類器的參數數據保存在一個xml文件中。
在實際使用過程中,這個文件的路徑將作為重要的參數和被檢測圖像一起傳給CascadeClassifier對象,接著對被檢測圖像中人臉進行定位。
而上一篇中,解析出的參數cascadeName,正是這個文件路徑
我們接著上一篇,繼續往下做,得到cascadeName后,構造CascadeClassifier對象”cascade”。
然后利用classifier對被檢測圖像進行人臉預測。
同樣,我們簡化源代碼,此次只對單張圖像進行檢測。
//根據分類器模板路徑cascadeName構造級聯分類器(CascadeClassifier)對象"cascade"cv::CascadeClassifier cascade(cascadeName);//讀入被檢測圖像Mat image = imread("D:/試驗/test/baby.png");//定義灰度圖像,用于暫存原圖像對應的灰度圖。Mat gray;//將原被檢測圖像從真彩色圖像轉換為灰度圖cvtColor(image, gray, cv::COLOR_BGR2GRAY);//定義一個向量(數組),用于存放所檢測出的人臉位置(注意:可能并不只有一個人臉)vector<Rect> faces;//啟動檢測cascade.detectMultiScale(gray,faces);//用紅色矩形繪制人臉位置結果for (int i = 0; i < faces.size(); i++){cv::rectangle(image, faces[i], Scalar(255, 0, 0));}//顯示最終被“標記”的圖像imshow("檢測人臉", image);//等待用戶輸入任意鍵結束程序waitKey();運行結果:
最后發下關于類CasadeClassifier的官方文檔解釋,本篇博文多是對該文檔的總結https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html
上一篇-----程序參數解析
下一篇-----微笑識別
總結
以上是生活随笔為你收集整理的人脸识别示例代码解析(二)——人脸识别解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NKNY]寒假培训《NY寒假有奖欢乐赛
- 下一篇: 深度篇——人脸识别(二) 人脸识别代码