OpenCV-Python密集的SIFT

时间:2013-11-22 13:55:02

标签: python opencv sift

OpenCV有very good documentation on generating SIFT descriptors,但这是“弱SIFT”的版本,其中关键点由原始Lowe algorithm检测到。 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中有两种方法可以做到这一点:

  • 我可以自己在网格中划分图像,并以某种方式将这些补丁转换为KeyPoints
  • 我可以使用基于网格的特征检测器

换句话说,我必须用能够提供我所需关键点的东西替换sift.detect()行。

我的问题是OpenCV文档的其余部分,特别是wrt Python,严重缺乏,所以我不知道如何实现其中任何一个。我在C ++文档中看到网格有关键点检测器,但我不知道如何从Python中使用它们。

另一种方法是切换到VLFeat,它具有非常好的DSift / PHOW实现,但意味着我必须从python切换到matlab。

有什么想法吗?感谢。

3 个答案:

答案 0 :(得分:21)

你可以在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)

答案 1 :(得分:4)

我不确定你的目标是什么,但要注意,SIFT描述符计算速度非常慢,并且从未设计为以密集的方式使用。话虽如此,OpenCV使这样做变得相当简单。

基本上不是使用sift.detect(),而是自己填充keypoint数组,方法是使网格成为关键点,无论它们多么密集。然后,当您将关键点传递给sift.compute()时,将为每个关键点计算描述符。

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

答案 2 :(得分:1)

尽管OpenCV方式成为标准,但对我来说这太慢了。所以为此,我使用了pyvlfeat,它基本上是对VL-FEAT的python绑定。这些函数具有与Matlab函数类似的语法