Hog特征提取 openCV

目標檢測的圖像特征提取之(一)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,結果就是這么來的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容