使用 Haar 級聯人臉檢測

2021-09-24 06:01:57 字數 3559 閱讀 3742

haar 級聯概念

在進行影象分類和跟蹤過程中,提取影象的細節很有用,這些細節也被稱為特徵,對於給定的影象,特徵可能會因區域的大小而有所不同,區域大小也可被稱為視窗大小。即使視窗大小不同,僅在尺度上大小不同的影象也應該有相似的特徵。這種特徵集合被稱為級聯。haar 級聯具有尺度不變性。opencv 提供了尺度不變haar 級聯的分類器和***。

需要注意的是, haar 級聯不具有旋轉不變性,即不認為側面照與正面照是相同的

獲取 haar 級聯資料

opncv 原**副本檔案提供了opencv 人臉檢測所需的xml檔案

從檔名可知這些級聯用於什麼跟蹤。這些檔案要求 直立的、正面的人臉影象,這些檔案都是通過大量的機器學習,最終訓練的結果,如果有很好的耐心,也可以建立自己的級聯,並訓練(train)這些級聯用於檢測不同的物件

靜態影象中的人臉檢測

使用:

進行人臉檢測,主要部分為兩部:

建立級聯分類器cv2.cascadeclassfier()利用建立的級聯分類器對影象進行多尺度檢測cv2.detectmultiscale()

cv2.detectmultiscale 主要引數:

在這些引數中,您需要更加關注其中的四個:

scalefactor - 指定在每個影象比例下影象大小減少多少的引數。

基本上,比例因子用於建立比例金字塔。總之,作為描述在這裡,你的模型訓練過程中定義乙個固定的大小,這是在xml可見。這意味著如果存在,則在影象中檢測到這種尺寸的面部。但是,通過重新縮放輸入影象,您可以將較大的面調整為較小的面,使其可被演算法檢測到。

1.05是乙個很好的可能值,這意味著你使用一小步調整大小,即減小5%的大小,你增加了與檢測模型匹配大小的機會。這也意味著演算法執行得更慢,因為它更徹底。您可以將其增加到1.4以便更快地進行檢測,並且可能會完全丟失一些面孔。

minneighbors - 引數指定每個候選矩形應保留多少個鄰居。此引數將影響檢測到的面部的質量。值越高,檢測越少,但質量越高。3~6對它來說是乙個很好的價值。用作乙個目標被多個視窗檢測出來時起調節作用。

minsize - 最小可能的物件大小。小於該值的物件將被忽略。

maxsize - 最大可能的物件大小。大於此值的物件將被忽略。

下面建立乙個實現人臉檢測:

# 級聯檢測要求為灰度圖

gray=cv2.cvtcolor(img,cv2.color_rgb2bgr)

# 建立級聯分類器

face_cascade=cv2.cascadeclassifier(

'./cascades/haarcascade_frontalface_default.xml'

)# 對影象進行檢測

faces=face_cascade.detectmultiscale(gray,

1.3,5)

# 檢測結果是矩形框

for(x,y,w,h)

in faces:

cv2.rectangle(img,

(x,y)

,(x+w,y+h),(

255,

255,0)

,2)cv2.imshow(

'face_cascade'

,img)

cv2.waitkey(

)cv2.destroyallwindows(

)檢測結果:

可以看到大多數都能檢測到,但是第乙個頭像沒有被檢測到,這個時候我們調整一下檢測的引數就能很好的檢測到全部的頭像了

import cv2

defdetect()

: face_cascade = cv2.cascadeclassifier(

'./cascades/haarcascade_frontalface_default.xml'

) eye_cascade=cv2.cascadeclassifier(

'./cascades/haarcascade_eye.xml'

) cameracapture = cv2.videocapture(0)

while

true

: success, frame = cameracapture.read(

) gray = cv2.cvtcolor(frame, cv2.color_bgr2gray)

faces = face_cascade.detectmultiscale(gray,

1.02,20

)for

(x, y, w, h)

in faces:

cv2.rectangle(frame,

(x, y)

,(x + w, y + h),(

255,

255,0)

,2) roi_gray=gray[y:y+h,x:x+w]

img=frame[y:y+h,x:x+w]

eyes=eye_cascade.detectmultiscale(roi_gray,

1.03,5

,0)for

(ex,ey,ew,eh)

in eyes:

cv2.rectangle(img,

(ex,ey)

,(ex+ew,ey+eh),(

0,255,

255),2

) cv2.imshow(

'camera'

, frame)

if cv2.waitkey(

1000

//12)&

0xff

==ord

('q'):

break

cameracapture.release(

) cv2.destroyallwindows(

)if __name__==

'__main__'

: detect(

)

上面示例中的第二個for 迴圈用於在已檢測好的人臉矩形框中檢測眼睛並畫出,在眼睛檢測中多了幾個引數,用於限制大小,因為眼睛是乙個比較小的特徵,很容易受其他因素的干擾,固指定帶線啊哦,去掉假陽性。

其他需要注意的是人臉檢測與人臉識別是有區別的,opencv 中的人臉識別有三種model

eigenfaces

fishe***ces

local binary pattern histogram (lbph)

你需要做的就是準備好訓練資料(可以編寫自己編寫指令碼儲存獲取影象),當作引數傳遞給這三個方法中的乙個,然後使用predict方法對你新獲取的資料進行**。

Python應用一 haar人臉檢測

使用國內源來安裝速度更快,參考教程 知乎教程安裝完畢之後,先測試一下opencv是否可以使用,所以可以先輸入一些簡單的 來測試一下。import cv2 開啟專案資料夾下面的photo子資料夾下的檔案 img cv2.imread r photo lena.png cv2.imshow lena i...

人臉檢測級聯分類器

對於人臉識別這種型別的應用來說,通常都會分為幾個步驟 人臉檢測 face detection 檢測到人臉所在的區域。並進行一系列的矯正。人臉校準 face alignment 人臉校準指的是在中尋找到鼻子 眼睛 嘴巴之類的位置。如圖中,紅色的框是在進行檢測,白色的點是在進行校準。資訊識別 info ...

機器學習 人臉檢測和Haar分類器

haar分類器是乙個基於樹的分類器,它建立了boost篩選式級聯分類器。可以使用opencv中的 人臉 檢測器來檢測 基本剛性的 物體 臉,汽車,自行車,人體 通過成千上萬的物體各個角度的訓練影象,訓練出新的分類器 這個技術被用來設計目前最優的檢測演算法。因此,對於此類識別的任務,haar分類器是乙...