2011-10-04 160 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