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。
有什么想法吗?谢谢。
我不知道你的目标是什么,但是要注意,SIFT描述符的计算非常慢,而且从来没有被设计成密集使用。也就是说,OpenCV使得这样做变得相当简单。
基本上,不用sift.detect(),只需通过将网格设为任意密集的关键点来填充keypoint数组。然后,当您将关键点传递给sift.compute()时,将为每个关键点计算一个描述符。
根据图像的大小和机器的速度,这可能需要很长时间。如果共变异时间是一个因素,我建议您看看OpenCV必须提供的一些binary描述符。
您可以在opencv 2.4.6<;中使用密集筛;。 按名称创建特征检测器。
然后
"Dense"
字符串代替detectorType例如:
尽管OpenCV方式是标准的,但对我来说太慢了。为此,我使用了pyvlfeat,它基本上是python与VL-FEAT的绑定。函数的语法与Matlab函数相似
相关问题 更多 >
编程相关推荐