OpenCV-Python密集的SIFT

Doa*_*Doa 14 python opencv 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)
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是强/密SIFT,它不检测关键点,而是计算一组补丁(例如16x16像素,8像素填充)的SIFT描述符,覆盖图像作为网格.据我了解,在OpenCV中有两种方法可以做到这一点:

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

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

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

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

有任何想法吗?谢谢.

mad*_*ram 22

你可以在opencv 2.4.6中使用Dense Sift <.按名称创建特征检测器.

cv2.FeatureDetector_create(detectorType)

然后用"Dense"string代替detectorType

例如:-

dense=cv2.FeatureDetector_create("Dense")
kp=dense.detect(imgGray)
kp,des=sift.compute(imgGray,kp)
Run Code Online (Sandbox Code Playgroud)


Dav*_*sek 4

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

基本上,您不需要使用 sift.detect(),只需通过将网格设置为关键点来自行填充关键点数组,无论您想要它们的密度如何。然后,当您将关键点传递给 sift.compute() 时,将为每个关键点计算一个描述符。

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