我只是在OpenCV中做一个特征检测的例子。这个例子如下所示。它给了我以下的错误
模块对象没有属性“drawMatches”
我已经检查了OpenCV文档,不确定为什么会出现这个错误。有人知道为什么吗?
import numpy as np
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread('box.png',0) # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage
# Initiate SIFT detector
orb = cv2.ORB()
# find the keypoints and descriptors with SIFT
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Match descriptors.
matches = bf.match(des1,des2)
# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10], flags=2)
plt.imshow(img3),plt.show()
错误:
Traceback (most recent call last):
File "match.py", line 22, in <module>
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10], flags=2)
AttributeError: 'module' object has no attribute 'drawMatches'
drawMatches
函数不是Python接口的一部分。正如您在docs中看到的,目前它只为
C++
定义。文件摘录:
如果函数有一个Python接口,您会发现如下内容:
编辑
实际上有一个commit在5个月前引入了这个函数。但是,官方文件中还没有 确保您使用的是最新的OpenCV版本(2.4.7)。 为了完整起见,OpenCV 3.0.0的函数接口看起来像this:
我知道这个问题有一个公认的答案是正确的,但是如果您使用的是OpenCV 2.4.8而不是3.0(-dev),解决方法可能是使用
opencv\sources\samples\python2\find_obj
中包含的示例中的一些函数这是输出图像:
我也迟到了,但是我为Mac OS X安装了OpenCV 2.4.9,而且
drawMatches
函数在我的发行版中不存在。我也尝试过用find_obj
的第二种方法,但这对我也不起作用。因此,我决定编写自己的实现,尽我所能模仿它,这就是我所制作的。我已经提供了我自己的图像,其中一个是一个摄像师,另一个是相同的图像,但旋转55度逆时针方向。
我所写的基础是我分配了一个输出RGB图像,其中行的数量是两个图像的最大值,以便将两个图像放在输出图像中,而列只是这两个列的总和。请注意,我假设这两个图像都是灰度的。
我将每个图像放在它们对应的点上,然后遍历所有匹配的关键点的循环。我提取两个图像之间匹配的关键点,然后提取它们的
(x,y)
坐标。我在每个检测到的位置画圆圈,然后画一条线把这些圆圈连接在一起。请记住,第二幅图像中检测到的关键点与其自身坐标系有关。如果要将其放置在最终输出图像中,则需要将列坐标偏移第一个图像中的列数,以使列坐标相对于输出图像的坐标系。
不费吹灰之力:
为了说明这一点,下面是我使用的两个图像:
我使用OpenCV的ORB检测器来检测关键点,并使用标准化的Hamming距离作为相似度的距离度量,因为这是一个二进制描述符。因此:
这是我得到的图像:
与
knnMatch
一起使用我想说明一下,只有假设匹配项出现在1D列表中,上述代码才起作用。但是,如果决定使用
cv2.BFMatcher
中的knnMatch
方法,则返回的是列表列表列表。具体来说,给定img1
中名为des1
的描述符和img2
中名为des2
的描述符,从knnMatch
返回的列表中的每个元素都是来自des2
的k
匹配项的另一个列表,它们最接近des1
中的每个描述符。因此,来自knnMatch
输出的第一个元素是来自des2
的k
匹配的列表,这些匹配最接近des1
中找到的第一个描述符。来自knnMatch
输出的第二个元素是来自des2
的k
匹配的列表,这些匹配最接近des1
中找到的第二个描述符,依此类推。为了充分理解
knnMatch
,必须将要匹配的邻居总数限制为k=2
。原因是您希望使用至少两个匹配点来验证匹配的质量,如果质量足够好,您将希望使用这些点绘制匹配并在屏幕上显示它们。您可以使用一个非常简单的比率测试(credit转到David Lowe)来确保从des2
到des1
中的描述符的第一个匹配点的距离与从des2
到第二个匹配点的距离相距一定距离。因此,要将从knnMatch
返回的内容转换为上面编写的代码所需的内容,请遍历匹配项,使用上面的比率测试并检查它是否通过。如果是,则将第一个匹配的关键点添加到新列表中。假设您像声明
BFMatcher
实例之前那样创建了所有变量,那么现在您可以这样做,以使knnMatch
方法适合使用drawMatches
:我想将上述修改归到用户@ryanmeasel身上,找到这些修改的答案是在他的文章OpenCV Python : No drawMatchesknn function。
相关问题 更多 >
编程相关推荐