人臉檢測原理及示例 OpenCV Python

2021-05-22 23:52:47 字數 4764 閱讀 8861

opencv是intel開源計算機視覺庫(computerversion)。它由一系列c函式和少量 c++類構成,實現了影象處理和計算機視覺方面的很多通用演算法。

?opencv 擁有包括 300 多個c函式的跨平台的中、高層 api。它不依賴於其它的外部庫——儘管也可以使用某些外部庫。opencv 對非商業應用和商業應用都是免費的。同時opencv提供了對硬體的訪問,可以直接訪問攝像頭,並且opencv還提供了乙個簡單的gui(graphics user inte***ce)系統:highgui。我們就通過opencv提供的一些方法來構造出這個人臉檢測(face detection)程式來。

opencv本身是有c/c++編寫的,如果要在其他語言中使用,我們可以通過對其動態鏈結庫檔案進行包裝即可,幸運的是,python下有很多個這樣的包裝,本文中使用的是cvtypes。

?事實上,在python中很多的包都是來自第三方的,比如pil(pythonimage library)即為c語言實現的乙個圖形處理包,被包裝到了python中,這些包裝可以讓你像使用python的內建函式一樣的使用這些api。

?人臉檢測屬於目標檢測(object detection)的一部分,主要涉及兩個方面

先對要檢測的目標物件進行概率統計,從而知道待檢測物件的一些特徵,建立起目標檢測模型。

用得到的模型來匹配輸入的影象,如果有匹配則輸出匹配的區域,否則什麼也不做。

計算機的視覺系統,跟人的眼睛是大不相同的,但是其中也有類似之處。人眼之能夠看到物體,是通過物體上反射出來的光線刺激人眼的感光細胞,然後視覺神經在大腦中形成物體的像。計算機通過攝像頭看到的東西要簡單的多,簡單來說,就是一堆由數字組成的矩陣。這些數字表明了物體發出的光的強弱,攝像頭的光敏元件將光訊號轉化成數碼訊號,將其量化為矩陣。

如何從這些數字中得出:"這是乙個人臉"的結論,是乙個比較複雜的事情。物理世界是彩色的,一般來說,計算機中的彩色都是由若干個色彩通道累積出來的,比如rgb模式的,有紅色通道(red),綠色通道(green)和藍色通道(blue),這三個通道都是灰度圖,比如乙個點由8位來表示,則乙個通道可以表示2^8=256個灰度。那樣三個通道進行疊加以後可以表3*8=24位種色彩,也就是我們常說的24位真彩。

對這樣的做處理,無疑是一件很複雜的事,所以有必要先將彩色圖轉為灰度圖,那樣可以減少資料量(比如rgb模式,可以減少到原的1/3),同時可以去掉一些雜訊訊號。先將轉化為灰度圖,然後將這個灰度圖的對比度增高,這樣可以使得本來暗的地方更暗,亮的地方更亮一些。這樣處理以後,就更容易被演算法設別出來了。

opencv在物體檢測上使用的是haar特徵的級聯表,這個級聯表中包含的是boost的分類器。首先,人們採用樣本的haar特徵進行分類器的訓練,從而得到乙個級聯的boost分類器。訓練的方式包含兩方面:

1.??? 正例樣本,即待檢測目標樣本

2.??? 反例樣本,其他任意的

首先將這些統一成相同的尺寸,這個過程被稱為歸一化,然後進行統計。一旦分類器建立完成,就可以用來檢測輸入中的感興趣區域的檢測了,一般來說,輸入的會大於樣本,那樣,需要移動搜尋視窗,為了檢索出不同大小的目標,分類器可以按比例的改變自己的尺寸,這樣可能要對輸入進行多次的掃瞄。

什麼是級聯的分類器呢?級聯分類器是由若干個簡單分類器級聯成的乙個大的分類器,被檢測的視窗依次通過每乙個分類器,可以通過所有分類器的視窗即可判定為目標區域。同時,為了考慮效率問題,可以將最嚴格的分類器放在整個級聯分類器的最頂端,那樣可以減少匹配次數。

基礎分類器以haar特徵為輸入,以0/1為輸出,0表示未匹配,1表示匹配。

?在掃瞄待檢測的時候,以邊界特徵中的(a)為例,正如前面提到的那樣,計算機中的是乙個數字組成的矩陣,程式先計算整個視窗中的灰度值x,然後計算矩形框中的黑色灰度值y,然後計算(x-2y)的值,得到的數值與x做比較,如果這個比值在某乙個範圍內,則表示待檢測的當前掃瞄區域符合邊界特徵(a),然後繼續掃瞄。

關於這個演算法的更詳細描述已經超出了本文的範圍,可以在參考資源中獲得更多的資訊。

步驟一:預處理

將從rgb模式轉為灰度圖將灰度圖

進行灰度圖直方圖均衡化操作

這兩個步驟在opencv中是非常簡單的:

image_size = cv.cvgetsize(image)#獲取原始影象尺寸
grayscale = cv.cvcreateimage(image_size, 8, 1)# 建立乙個空的灰度圖
cv.cvcvtcolor(image, grayscale, cv.cv_bgr2gray)#轉換
storage = cv.cvcreatememstorage(0)#新建一塊儲存區,以備後用
cv.cvclearmemstorage(storage)
cv.cvequalizehist(grayscale, grayscale)# 灰度圖直方圖均衡化
步驟二:檢測並標記目標

opencv中,對於人臉檢測的模型已經建立為乙個xml檔案,其中包含了上面提到的harr特徵的分類器的訓練結果,我們可以通重載入這個檔案而省略掉自己建立級聯表的過程。有了級聯表,我們只需要將待檢測和級聯表一同傳遞給opencv的目標檢測演算法即可得到乙個檢測到的人臉的集合。

# detect objects
cascade = cv.cvloadhaarclassifiercascade('haarcascade_frontalface_alt.xml',  cv.cvsize(1,1))
faces = cv.cvhaardetectobjects(grayscale, cascade, storage, 1.2, 2, cv.cv_haar_do_canny_pruning,cv.cvsize(50, 50))#設定最小的人臉為50*50畫素
if faces:
print 'face detected here', cv.cvgetsize(grayscale)
for i in faces:
cv.cvrectangle(image, cv.cvpoint( int(i.x), int(i.y)), cv.cvpoint(int(i.x + i.width), int(i.y + i.height)), cv.cv_rgb(0, 255, 0), 1, 8, 0)#畫乙個綠色的矩形框
highgui.cvnamedwindow ('camera', highgui.cv_window_autosize)
highgui.cvmovewindow ('camera', 50, 50)
highgui.cvshowimage('camera', detimg)
可以看到,opencv的api相當清晰,使用python的包裝,可以使得**非常小。好了,我們可以看看程式的執行結果:

拉普拉斯邊緣檢測

def laplacetransform(image):
laplace = none
colorlaplace = none
planes = [none, none, none]
image_size = cv.cvgetsize(image)
if not laplace:
for i in range(len(planes)):
planes[i] = cv.cvcreateimage(image_size, 8, 1)
laplace = cv.cvcreateimage(image_size, cv.ipl_depth_16s, 1)
colorlaplace = cv.cvcreateimage(image_size, 8, 3)
cv.cvsplit(image, planes[0], planes[1], planes[2], none)
for plane in planes:
cv.cvlaplace(plane, laplace, 3)
cv.cvconvertscaleabs(laplace, plane, 1, 0)
cv.cvmerge(planes[0], planes[1], planes[2], none, colorlaplace)
colorlaplace.origin = image.origin
return colorlaplace
效果圖:

?cvtypes中自帶了乙個關於影象色彩空間的直方圖的例子:

opencv的功能十分強大,而且提供了大量的演算法實現,文中涉及到的內容只是計算機視覺中很小的一部分。讀者可以考慮將採集到的人臉進行標識,從而實現特定人的人臉識別。或者考慮將人臉檢測移植到網路上,從而實現遠端監控。試想一下,原來沒有生命的機器,我們可以通過自己的思想,動作來使得它們看起來像是有思想一樣,這件事本身就非常的有趣。

OpenCV人臉檢測

include include include include include include include include include include static cvmemstorage storage 0 建立乙個記憶體儲存器,來統一管理各種動態物件的記憶體 static cvhaar...

OpenCV人臉檢測

win7 32位 opencv3.0 vs2013 對資料夾中進行人臉檢測 在opencv中,人臉檢測用的是harr或lbp特徵,分類演算法用的是adaboost演算法。這種演算法需要提前訓練大量的,非常耗時,因此opencv已經訓練好了,把訓練結果存放在一些xml檔案裡面。在opencv3.0版本...

opencv人臉檢測

最近有空對學習下opencv的東西,本篇主要記錄對人臉檢測實現,而人臉檢測是為人臉識別做準備。opencv版本 3.3.0 環境 vs2015 void cascadeclassifier detectmultiscale inputarray image,vector objects,double...