在Opencv中人臉識別是基於Haar特征+Adaboost級聯分類器來實現人臉識別的!
要理解這節內容,我們首先要明白什麽是特征?
特征其實就是某個區域的像素點經過運算之後得到的結果! 例如haar特征其實就是用下圖列出的模板在圖像中滑動,計算白色區域覆蓋的像素之和減去黑色區域覆蓋的像素之和,運算出來的結果就是haar特征值!
Haar特征壹般和Adaboost分類器結合在壹起進行目標識別!
這裏需要運動機器學習的知識! 不過值得慶幸的是Opencv已經為我們訓練好了數據,並且已經提取出了人臉的特征,在opencv的源碼中有相應的xml特征文件. 並且我們只需要調用opencv提供好的API即可快速完成人臉識別的功能!
核心api為:
實現步驟:
HSV(Hue, Saturation, Value)是根據顏色的直觀特性由A. R. Smith在1978年創建的壹種顏色空間, 也稱六角錐體模型(Hexcone Model)。
這個模型中顏色的參數分別是:色調(H),飽和度(S),明度(V)
用角度度量,取值範圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,品紅為300°;
飽和度S表示顏色接近光譜色的程度。壹種顏色,可以看成是某種光譜色與白色混合的結果。其中光譜色所占的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高。飽和度高,顏色則深而艷。光譜色的白光成分為0,飽和度達到最高。通常取值範圍為0%~100%,值越大,顏色越飽和。
明度表示顏色明亮的程度,對於光源色,明度值與發光體的光亮度有關;對於物體色,此值和物體的透射比或反射比有關。通常取值範圍為0%(黑)到100%(白)。
結論:
註意: 在opencv中,H、S、V值範圍分別是[0,180],[0,255],[0,255],而非[0,360],[0,1],[0,1];
這裏我們列出部分hsv空間的顏色值, 表中將部分紫色歸為紅色
[圖片上傳失敗...(image-4f70f7-1563843266225)]
.jpg)
註意,這僅僅只能做壹個比較粗糙的判定,按照我們人的正常思維,在傍晚臨界點我們也無法判定當前是屬於晚上還是白天!
在壹張圖片中,如果某個物體的顏色為純色,那麽我們就可以使用顏色過濾inRange的方式很方便的來提取這個物體.
下面我們有壹張網球的圖片,並且網球的顏色為壹定範圍內的綠色,在這張圖片中我們找不到其它顏色也為綠色的圖片,所以我們可以考慮使用綠色來提取它!
圖片的顏色空間默認為BGR顏色空間,如果我們想找到提取純綠色的話,我們可能需要寫(0,255,0)這樣的內容,假設我們想表示壹定範圍的綠色就會很麻煩!
所以我們考慮將它轉成HSV顏色空間,綠色的色調H的範圍我們很容易知道,剩下的就是框定顏色的飽和度H和亮度V就可以啦!
實現步驟:
圖像二值化( Image Binarization)就是將圖像上的像素點的灰度值設置為0 或 255,也就是將整個圖像呈現出明顯的黑白效果的過程。
在數字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化使圖像中數據量大為減少,從而能凸顯出目標的輪廓。
[圖片上傳失敗...(image-a31052-1563843266226)]
我們使用壹個全局值作為閾值。但是在所有情況下這可能都不太好,例如,如果圖像在不同區域具有不同的照明條件。在這種情況下,自適應閾值閾值可以幫助。這裏,算法基於其周圍的小區域確定像素的閾值。因此,我們為同壹圖像的不同區域獲得不同的閾值,這為具有不同照明的圖像提供了更好的結果。
除上述參數外,方法cv.adaptiveThreshold還有三個輸入參數:
該 adaptiveMethod 決定閾值是如何計算的:
該 BLOCKSIZE 確定附近區域的大小和 ? 是從平均值或附近的像素的加權和中減去壹個常數。
采用日本人大津提出的算法,又稱作最大類間方差法,被認為是圖像分割中閾值選取的最佳算法,采用這種算法的好處是執行效率高!
<img src="./img2/otsu.jpg" width="500" />
如果我們把圖像看作信號,那麽噪聲就是幹擾信號。我們在采集圖像時可能因為各種各樣的幹擾而引入圖像噪聲。在計算機中,圖像就是壹個矩陣, 給原始圖像增加噪聲, 我們只需要讓像素點加上壹定灰度即可.
f(x, y) = I(x, y) + noise
常見的噪聲有椒鹽噪聲(salt and pepper noise),為什麽叫椒鹽噪聲?因為圖像的像素點由於噪聲影響隨機變成了黑點(dark spot)或白點(white spot)。這裏的“椒”不是我們常見的紅辣椒或青辣椒,而是外國的“胡椒”(香料的壹種)。我們知道,胡椒是黑色的,鹽是白色的,所以才取了這麽個形象的名字.
接下來我們來生成10%的椒噪聲和鹽噪聲:
我們還要註意,opencv的圖像矩陣類型是uint8,低於0和高於255的值並不截斷,而是使用了模操作。即200+60=260 % 256 = 4。所以我們需要先將原始圖像矩陣和噪聲圖像矩陣都轉成浮點數類型進行相加操作,然後再轉回來。