星標或者置頂【OpenCV學堂】
乾貨文章與技術教程第一時間送達
HOG概述HOG(Histogram of Oriented Gradient)特徵在對象檢測與模式匹配中是一種常見的特徵提取算法,是基於本地像素塊進行特徵直方圖提取的一種算法,對象局部的變形與光照影響有很好的穩定性,最初是用HOG特徵來來識別人像,通過HOG特徵提取+SVM訓練,可以得到很好的效果,OpenCV已經有了。HOG特徵提取的大致流程如下:
詳細解讀第一步:灰度化
對HOG特徵提取來說第一步是對輸入的彩色圖像轉換為灰度圖像,圖像灰度化的方法有很多,不同灰度化方法之間有一些微小的差異,從彩色到灰度的圖像轉換可以表示如下:
第二步:計算圖像梯度
計算圖像的X方向梯度dx與Y方向梯度dy,根據梯度計算mag與角度,計算梯度時候可以先高斯模糊一下(可選步驟),然後使用sobel或者其它一階導數算子計算梯度值dx、dy、mag、angle:
第三步:Cell分割與Block
對於圖像來說,分成8x8像素塊,每個塊稱為一個Cell,每個2x2大小的Cell稱為一個Block,每個Cell根據角度與權重建立直方圖,每20度為一個BIN,每個Cell得到9個值、每個Block得到36個值(4x9), 圖像如下:
每個Block為單位進行L2數據歸一化,作用是抵消光照/遷移影響,L2的歸一化的公式如下:
第四步:生成描述子
對於窗口64x128範圍大小的像素塊,可以得到8x16個Cell, 使用Block在窗口移動,得到輸出的向量總數為7x15x36=3780特徵向量,每次Block移動步長是八個像素單位,一個Cell大小。
HOG特徵本身是不支持旋轉不變性與多尺度檢測的,但是通過構建高斯金字塔實現多尺度的開窗檢測就會得到不同解析度的多尺度檢測支持。OpenCV中HOG多尺度對象檢測API如下:
virtual void cv::HOGDescriptor::detectMultiScale(
InputArray img,
std::vector< Rect > & foundLocations,
double hitThreshold = 0,
Size winStride = Size(),
Size padding = Size(),
double scale = 1.05,
double finalThreshold = 2.0,
bool useMeanshiftGrouping = false
)
Img-表示輸入圖像
foundLocations-表示發現對象矩形框
hitThreshold-表示SVM距離度量,默認0表示,表示特徵與SVM分類超平面之間
winStride-表示窗口步長
padding-表示填充
scale-表示尺度空間
finalThreshold-最終閾值,默認為2.0
useMeanshiftGrouping-不建議使用,速度太慢拉
使用OpenCV預訓練SVM行人HOG特徵分類器實現多尺度行人檢測的代碼如下:
import cv2 as cv
if __name__ == '__main__':
src = cv.imread("D:/images/pedestrian.png")
cv.imshow("input", src)
hog = cv.HOGDescriptor()
hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
(rects, weights) = hog.detectMultiScale(src,
winStride=(4, 4),
padding=(8, 8),
scale=1.25,
useMeanshiftGrouping=False)
for (x, y, w, h) in rects:
cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv.imshow("hog-detector", src)
cv.waitKey(0)
cv.destroyAllWindows()
原圖顯示如下:
運行顯示如下:
伏久者,飛必高
開先者,謝獨早
歡迎掃碼加入【OpenCV研習社】
推薦閱讀
OpenCV學堂-原創精華文章
《tensorflow零基礎入門視頻教程》
基於OpenCV與tensorflow實現實時手勢識別
圖像分割網絡FCN詳解與代碼實現
深度學習中的反向卷積
tensorflow風格遷移網絡訓練與使用
OpenCV SIFT特徵算法詳解與使用
OpenCV中MeanShift算法視頻移動對象分析
基於OpenCV Python實現二維碼檢測與識別
聽說點【好看】會有好運來