OpenCV-Python密集SIFT

14

OpenCV 有非常好的文档可以生成SIFT描述符, 但这是一个“弱SIFT”版本,该版本使用原始Lowe算法检测关键点。OpenCV示例读起来像这样:

img = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray,None)
kp,des = sift.compute(gray,kp)

我需要的是强大/密集的SIFT,它不会检测关键点,而是为覆盖图像的一组补丁(例如16x16像素,8像素填充)计算SIFT描述符。据我所知,在OpenCV中有两种方法可以实现这一点:
  • 我可以自己将图像划分为网格,然后以某种方式将这些补丁转换为关键点
  • 我可以使用基于网格的特征检测器
换句话说,我必须用能给我所需关键点的东西替换行。
我的问题是OpenCV文档的其余部分,特别是Python方面,非常缺乏,因此我不知道如何实现这两个事情。我在C++文档中看到了基于网格的关键点检测器,但我不知道如何从Python中使用它们。
另一种选择是切换到VLFeat,它有一个非常好的DSift / PHOW实现,但意味着我必须从python切换到matlab。
有什么想法吗?谢谢。

OpenCV的最新版本(或至少其Python绑定)似乎不再支持.detect和.compute...相反,您必须使用.detectAndCompute,这意味着不再可能生成自己的关键点。 - bard
这并不适用于OpenCV3。 - P.R.
3个回答

23

您可以在opencv 2.4.6<中使用Dense Sift。通过其名称创建特征检测器。

cv2.FeatureDetector_create(detectorType)

然后将"Dense"字符串放入detectorType的位置。

例如:

dense=cv2.FeatureDetector_create("Dense")
kp=dense.detect(imgGray)
kp,des=sift.compute(imgGray,kp)

不是我想抢答案,但是在C++中是否也可以做到同样的事情呢?有没有人能指点一下我? - The Nomadic Coder
1
@SemicolonWarrier 是的,这是可能的。请看这里http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html#featuredetector-create - Yasser Souri

4

我不确定你的目标是什么,但请注意,SIFT描述符计算非常缓慢,从未设计用于密集运算。尽管如此,OpenCV使得这很容易实现。

基本上,你只需自己填充keypoint数组,方法是按照你想要的密度将网格分成关键点。然后,当你将关键点传递给sift.compute()时,将为每个关键点计算一个描述符。

根据图像的大小和计算机的速度,这可能需要很长时间。如果计算时间是一个因素,我建议你看看OpenCV提供的一些二进制描述符。


1
谢谢David。那么我的问题是:我应该用什么来填充关键点数组?我能从OpenCV API页面中推断出正确的格式吗?感谢您提醒SIFT速度问题,VLFeat密集SIFT实现似乎非常快,所以我想我会选择它。 - Doa
1
此外,目标是将其用于场景/对象分类,其中密集sift似乎比“普通”sift更适合。 - Doa
我刚在这里用一个例子回答了这个问题https://dev59.com/cJDea4cB1Zd3GeqPWhP9#33702400,如果还有兴趣的话。 - P.R.

2

尽管OpenCV是标准,但对我来说速度太慢了。因此,我使用了pyvlfeat,它基本上是VL-FEAT的Python绑定。这些函数具有与Matlab函数类似的语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接