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分類器是乙...