解决AttributeError: 'BFMatcher' object has no attribute 'knnMatch'
时间: 2023-06-21 20:14:04 浏览: 238
新人学习python的django框架常见问题总结
这个错误通常是因为版本问题导致的。在 OpenCV 2.x 中,BFMatcher 类没有 knnMatch 方法,而在 OpenCV 3.x 中,BFMatcher 类已经添加了 knnMatch 方法。
如果你使用的是 OpenCV 2.x 版本,则应该改用 match 方法,而不是 knnMatch 方法。如果你使用的是 OpenCV 3.x 版本或更高版本,则应该使用 knnMatch 方法。
因此,你需要检查你的 OpenCV 版本并相应地更改你的代码。如果你使用的是 OpenCV 2.x 版本,则应该将代码中的 knnMatch 替换为 match。如果你使用的是 OpenCV 3.x 版本或更高版本,则应该保留 knnMatch 方法。
以下是 OpenCV 2.x 中使用 BFMatcher 的示例代码:
```
import cv2
img1 = cv2.imread('img1.png', 0)
img2 = cv2.imread('img2.png', 0)
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.match(des1,des2)
# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10], flags=2)
cv2.imshow("Matches", img3)
cv2.waitKey(0)
```
以下是 OpenCV 3.x 中使用 BFMatcher 的示例代码:
```
import cv2
img1 = cv2.imread('img1.png', 0)
img2 = cv2.imread('img2.png', 0)
# Initiate SIFT detector
sift = cv2.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2)
# Apply ratio test
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
# Draw first 10 matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good[:10],flags=2)
cv2.imshow("Matches", img3)
cv2.waitKey(0)
```
阅读全文