2011-10-04 293 views
6

在Python OpenCV中使用HOGDescriptor功能是否有任何有用的文檔?我已經閱讀了C++文檔,但是Python版本的功能不同,我不能僅僅通過修改就能搞清楚。OpenCV Python和麪向方向梯度直方圖

最特別的是,我在Python中尋找一個將圖像和像素位置作爲輸入的OpenCV命令(可能還有一些關於檢測窗口大小的參數),然後返回一個包含HOG的Python數組特徵向量(即列表或NumPy數組等,其中列表的第j個元素是來自定向梯度直方圖的第j個直方圖分量)。

我的目標是將這些直方圖提供給scikits.learn SVM管道(這樣我就可以避免OpenCV SVM培訓),但要做到這一點,我需要實際的特徵向量本身,而不是HOG處理鏈管道的東西OpenCV似乎使用。

HOG代碼的任何其他Python實現也可以工作。我需要一些相當有效的方法來與另一個我自己編寫的代碼庫進行比較。

+0

注意:具有易於使用的命令行參數的合理C++可執行文件也可以工作,我可以將它包裝到我的Python內容中。如果您知道任何具有高效HOG代碼的項目,可能會有所幫助。 – ely

回答

0

如何一點Matlab爲靈感,屬於該article

+0

謝謝!我可以自己把它翻譯成Python。不過,將其轉移到其他語言可能會比較困難。 – ely

0

看看http://sourceforge.net/projects/hogtrainingtuto/?_test=beta對於一些HOG python代碼和一堆C,cpp,java實現。至於python和opencv的真實文檔,我也不知所措。但是,這會幫助你有點

+0

我從該鏈接下載的檔案文件中沒有看到任何Python代碼。唯一與HOG相關的東西是名爲'cvHogFeatureCal'的可執行文件,但它沒有我能找到的文檔。另一方面,OpenCV通常將分類器實現爲級聯,其中用戶輸入嚴重的負面圖像,然後輸入真正的訓練信息,而OpenCV自動地一直生成分類器。我特別需要避免這種情況,只是劫持HOG特徵向量,然後用不同的軟件(scikits.learn)進行分類器訓練。 – ely

0

的「Poselets」實施here已經HOG描述符的C實現它,雖然與MATLAB寫在心中,可以適應使用ctypes和numpy運行python。

您可以刪除所有mex例程,並在C函數中聲明您的輸入和輸出數組爲float *

您確實需要確保您的numpy數組是Fortran連續的。這可以通過以下方式實現:

image = image.copy(order='F', dtype = float32)

+0

我經常使用Poselet的東西。根據他們的Java代碼對於他們的瀏覽器註釋工具的非文檔化和不可理解性,我傾向於在頂部帖子中使用Matlab代碼。雖然這個概念很好,但事實上(a)它在Matlab中;(b)他們不想通過提供對代碼的支持來幫助科學家,這讓我更不願意使用他們的東西。翻譯來自Maurits的頂級Matlab例程可能是同樣多的工作。 – ely

+0

夠公平的,我還沒有嘗試過很多的實現,我想主要是由於它缺乏文檔!但是,我已經使用他們的HOG例程構建了類似的東西,就像我上面所概述的那樣,它運行良好。如果速度是一個優先事項,利用他們的C例程可能是一個比python中的嵌套循環更好的解決方案。 – Martin

5

這是晚了一點,但是,以供將來參考,scikit-imageHOG的實現。這是一個可以提取給定圖像的定向梯度直方圖的單一功能。

+2

是的,在它被scikits.image接受之前,我已經得到了一個高級副本。我發現它不夠好或不夠快。另一件事是界面太難使用了。例如,Dalal和Trigg HoG代碼接受圖像中的關鍵點列表,而scikits.image版本只能執行修補程序。我最終只寫了自己的代碼。我爲Python編寫了一個簡單的「vanilla」HoG,也寫了我自己的版本的金字塔HoG。最後,我在PyCUDA中實現了兩個GPU版本。你可以找到鏈接的代碼[這裏](http://people.seas.harvard.edu/~ely/faceparts/software.html) – ely