目標檢測的圖像特征提取之(一)HOG特征
這篇文章講的比較透徹,可以參考。需要注意的是,這篇文章最后的例子計算結果是錯誤的,正確結果是2340。
OpenCV HOGDescriptor 參數圖解
這篇文章通過圖解的方式詳細解釋了一下window、block、cell的關系。
HOG特征-理解篇
這是大神@Rachel-Zhang 寫的。
opencv源碼解析之(6):hog源碼分析
openCV的hog源碼解析。
openCV的實現代碼:
Mat imageMat;
imageMat = imread("/Users/***/Desktop/640_480.png", 1);//圖像大小640 * 480
if (!imageMat.data) {
printf("No image data.\n");
return -1;
}
HOGDescriptor *hog = new HOGDescriptor(cvSize(64, 48), cvSize(32, 32), cvSize(8, 8), cvSize(16, 16), 9);
vector<float> descriptors;
hog->compute(imageMat, descriptors, Size(2, 2), Size(0, 0));
cout << "descriptors.size = " << descriptors.size() << endl;//輸出hog特征描繪子的維度
輸出是
descriptors.size = 54000
解釋一下函數參數:
---HOGDescriptor
函數
cvSize(64, 48)
:滑動窗口大小
cvSize(32, 32)
:block大小
cvSize(8, 8)
:block的移動步長
cvSize(16, 16)
:cell大小
9
:bins個數
前四個參數的單位都是像素。
---compute
函數
imageMat
:圖像
descriptors
:hog描繪子(是一個向量,計算結果就儲存在descriptors中)
Size(64, 48)
:窗口的移動步長
Size(0, 0)
:圖像的padding補償,因為有些圖像的大小可不不那么合適,不能整除窗口大小,所以,可以在周圍添加一圈補償像素。
運行輸出結果是 54000,咋來的呢?
是這樣,先計算一個窗口的特征長度。一個cell是9個維度,一個block有4個cell,那么一個block就有4*9=36個維度。滑動窗口大小是64*48,block大小是32*32,block的步長是8*8,那么在窗口內,block橫向掃描 (64 - 32) / 8 + 1 = 5次,縱向掃描 (48 - 32) / 8 + 1 = 3次,那么總共掃描 3 * 5 = 15次,15 * 36 = 540,即一個窗口的特征維度大小是540.
然后,窗口在圖像上滑動,圖像大小 640*480,窗口大小 64*48,滑動步長是 64*48,那么橫向掃描 (640 - 64) / 64 + 1 = 10 次,縱向掃描 (480 - 48) / 48 + 1 = 10 次,那么總共掃描窗口 100次。
當然,這里的窗口滑動步長設置的是不合理的,為了方便計算我寫的是 (64, 48)。
所以,540*100 = 54000,結果就是這么來的。