1.3 案列---計算haar特徵值
1.4 特徵值歸一化
1.5 adaboost級聯分類器
2 python**實現
學習目標:
haar特徵分為三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值為白色矩形畫素和減去黑色矩形畫素和。haar特徵值反映了影象的灰度變化情況。
eg:臉部的一些特徵能由矩形特徵簡單的描述:眼睛要比臉頰顏色要深,鼻樑兩側要比鼻樑顏色要深。但矩形特徵只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。
對於圖中的a,b和d類這類特徵,特徵數值計算公式為:v=σ白-σ黑,而對於c來說,計算公式如下:v=σ白-2*σ黑;之所以將黑色區域畫素和乘以2,是為了使兩種矩形區域中畫素數目一致。我們希望當把矩形放到人臉區域計算出來的特徵值和放到非人臉區域計算出來的特徵值差別越大越好,這樣就可以用來區分人臉和非人臉。
通過改變特徵模板的大小和位置,可在影象子視窗中窮舉出大量的特徵。上圖的特徵模板稱為「特徵原型」;特徵原型在影象子視窗中擴充套件(平移伸縮)得到的特徵稱為「矩形特徵」;矩形特徵的值稱為「特徵值」。
**解釋:**兩個矩形特徵,表示出人臉的某些特徵。比如中間一幅表示眼睛區域的顏色比臉頰區域的顏色深,右邊一幅表示鼻樑兩側比鼻樑的顏色要深。
矩形特徵值是矩形模版類別、矩形位置和矩形大小這三個因素的函式。因此類別、大小和位置的變化,使得很小的檢測視窗含有非常多的矩形特徵。例如:在24*24畫素大小的檢測視窗內矩形特徵數量可以達到16萬個。
這樣就有兩個問題需要解決:
如何快速計算那麼多特徵?—積分圖大顯神通
那些矩形特徵才是對分類器分來是最有效的?----通過adaboost演算法來訓練。
積分圖就是只遍歷一次影象就可以求出影象中所有區域畫素和的快速演算法,大大的提高了影象特徵值計算的效率。
是將影象從起點開始到各個點所形成的矩形區域畫素之和作為乙個陣列的元素儲存在記憶體中,當要計算某個區域的畫素和時可以直接索引陣列的元素,不用重新計算這個區域的畫素和,從而加快了計算(這有個相應的稱呼,叫做動態規劃演算法)。
積分圖是一種能夠描述全域性資訊的矩陣表示方法。積分圖的構造方式是:位置(i,j)處的值ii(i,j)是原影象(i,j)左上角方向所有畫素f(k,l)的和: ,其中i(x,y)表示畫素點(x,y)的積分圖,i(x,y)表示原始影象。
構建演算法步驟:
乙個區域的畫素值的和,可以由該區域的端點的積分圖來計算。
由前面特徵模板的特徵值的定義可以推出,矩形特徵的特徵值可以由特徵端點的積分圖計算出來。以a矩形特徵為例,如下圖,使用積分圖計算其特徵值:
該矩形特徵的特徵值,由定義可知為區域a的畫素值減去區域b的畫素值。
區域a的畫素值:ii(5)-ii(2)-ii(4)+ii(1),就是相當於多減去ii(1)一次
區域b的畫素值:ii(6))-ii(5)-ii(3)+ii(2,相當於多減去ii(2)一次
發現僅僅乙個128大小的haar特徵計算出的特徵值變化範圍從-2000~+6000,跨度非常大。這種跨度大的特性不利於量化評定特徵值,所以需要進行「歸一化」,壓縮特徵值範圍。
歸一化方法:
計算檢測視窗中影象的灰度值和灰度值平方和:
計算平均值:
計算歸一化因子:
歸一化特徵值:
匯入這裡xml檔案,就是opencv自帶的檢測器。
import cv2
import numpy as np
haar_front_face_xml =
'./data/haarcascade_frontalface_default.xml'
haar_eye_xml =
'./data/haarcascade_eye.xml'
# 1.靜態影象中的人臉檢測
defstaticdetect
(filename)
:# 建立乙個級聯分類器 載入乙個 .xml 分類器檔案. 它既可以是haar特徵也可以是lbp特徵的分類器.
face_cascade = cv2.cascadeclassifier(haar_front_face_xml)
# 載入影象
img = cv2.imread(filename)
# 轉換為灰度圖
gray_img = cv2.cvtcolor(img, cv2.color_bgr2gray)
# 進行人臉檢測,傳入scalefactor:1.3,minnegihbors:5,分別表示人臉檢測過程中每次迭代時影象的壓縮率以及
每個人臉矩形保留近似數目的最小值,返回人臉矩陣陣列
faces = face_cascade.detectmultiscale(gray_img,
1.3,5)
for(x, y, w, h)
in faces:
# 在原影象上繪製矩形
img = cv2.rectangle(img,
(x, y)
,(x + w, y + h),(
255,0,
0),2
) cv2.namedwindow(
'face detected!'
) cv2.imshow(
'face detected!'
, img)
cv2.waitkey(0)
cv2.destroyallwindows(
)
def
dynamicdetect()
:'''
開啟攝像頭,讀取幀,檢測幀中的人臉,掃瞄檢測到的人臉中的眼睛,對人臉繪製藍色的矩形框,對人眼繪製綠色的矩形框
'''# 建立乙個級聯分類器 載入乙個 .xml 分類器檔案. 它既可以是haar特徵也可以是lbp特徵的分類器.
face_cascade = cv2.cascadeclassifier(haar_front_face_xml)
eye_cascade = cv2.cascadeclassifier(haar_eye_xml)
# 開啟攝像頭
camera = cv2.videocapture(0)
cv2.namedwindow(
'dynamic'
)while
true
:# 讀取一幀影象
ret, frame = camera.read(
)# 判斷讀取成功?
if ret:
gray_img = cv2.cvtcolor(frame, cv2.color_bgr2gray)
# 人臉檢測
faces = face_cascade.detectmultiscale(gray_img,
1.3,5)
for(x, y, w, h)
in faces:
# 在原影象上繪製矩形
cv2.rectangle(frame,
(x, y)
,(x + w, y + h),(
255,0,
0),2
) roi_gray = gray_img[y:y + h, x:x + w]
# 眼睛檢測
eyes = eye_cascade.detectmultiscale(roi_gray,
1.03,5
,0,(
40,40)
)for
(ex, ey, ew, eh)
in eyes:
cv2.rectangle(frame,
(ex + x, ey + y)
,(x + ex + ew, y + ey + eh),(
0,255,0)
,2) cv2.imshow(
'dynamic'
, frame)
# 如果按下q鍵則退出
# dynamicdetect()
總結一下detectmultiscale函式:
detectmultiscale(image[,scalefactor[,minneighbors[,flags[,minsize[,maxsize]]]]])
詳解HOG特徵描述運算元中的難點
3.block中的拼接 梯度是在一副影象中尋找邊緣強度和方向的工具。梯度是用一階微分來實現的。先看下圖,梯度的表示。梯度的大小是用如下公式表示的。由於該公式下的計算會導致巨大的計算開銷,在多數情況下,是使用絕對值來近似平方和平方根的計算。該操作如下所示 梯度的方向由以下公式表示 需要注意的是,任意一...
ORB 特徵描述子
在常規立體匹配中特徵點匹配一直是研究重點,特徵點的描述是立體匹配的前提,orb特徵優點是速度快和較高的精度。rb 特徵亦由關鍵點和描述子兩部分組成。它的關鍵點稱為 oriented fast 是 一種改進的 fast 角點。它的描述子稱為 brief binary robust independen...
Task03 Haar特徵描述運算元 人臉檢測
3.1簡介 haar like特徵最早是由papageorgiou等應用於人臉表示,在2001年,viola和jones兩位大牛發表了經典的 rapid object detection using a boosted cascade of features 和 robust real time f...