OpenCV Python密集筛

2024-05-12 20:21:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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中有两种方法:

  • 我可以自己将图像分割成一个网格,然后将这些补丁转换成关键点
  • 我可以使用基于网格的特征检测器

换言之,我必须用能提供我所需关键点的东西来替换sift.detect()行。

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

另一种选择是切换到VLFeat,它有一个非常好的DSift/PHOW实现,但这意味着我将不得不从python切换到matlab。

有什么想法吗?谢谢。


Tags: 文档图像网格img像素cv2opencv检测器
3条回答

我不知道你的目标是什么,但是要注意,SIFT描述符的计算非常慢,而且从来没有被设计成密集使用。也就是说,OpenCV使得这样做变得相当简单。

基本上,不用sift.detect(),只需通过将网格设为任意密集的关键点来填充keypoint数组。然后,当您将关键点传递给sift.compute()时,将为每个关键点计算一个描述符。

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

您可以在opencv 2.4.6<;中使用密集筛;。 按名称创建特征检测器。

cv2.FeatureDetector_create(detectorType)

然后"Dense"字符串代替detectorType

例如:

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

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

相关问题 更多 >