繁体   English   中英

OpenCV-Python密集的SIFT

[英]OpenCV-Python dense SIFT

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中有两种方法可以做到这一点:

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

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

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

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

有任何想法吗? 谢谢。

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

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

基本上不是使用sift.detect(),而是通过使网格成为关键点而不是你想要的密集来自己填充关键点数组。 然后,当您将关键点传递给sift.compute()时,将为每个关键点计算描述符。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM