【问题标题】:OpenCV Python : No drawMatchesknn functionOpenCV Python:没有drawMatchesknn函数
【发布时间】:2013-12-08 23:47:48
【问题描述】:

当我尝试使用 tutorial 中提到的 drawMatchesKnn 函数进行 FLANN 特征匹配时,我收到以下错误

AttributeError: 'module' 对象没有属性 'drawMatchesKnn'

我用其他资源检查了 opencv 中存在 drawMatchesKnn 方法。

为什么会出现这个错误?

提前致谢

【问题讨论】:

  • OpenCV 版本:2.4.7
  • 使用 opencv 版本 3.x。在 master 分支中从源代码构建
  • IMP - This tutorial is meant for OpenCV 3x version. Not OpenCV 2x,它在 README 页面上说得很清楚。你没读过吗?
  • @bad_keypoints 实际上教程不适用于 2x 或 3x。教程充满了像 cv2.SIFT() 这样的调用,这些调用在 3x 中不存在(需要用 contrilbs 编译并像 cv2.xfeatures2d.SIFT_create() 一样调用,所以教程只是新旧混杂,很少有真正工作而不改变的。

标签: opencv python-2.7 flann


【解决方案1】:

函数 cv2.drawMatchescv2.drawMatchesKnn 在较新版本的 OpenCV 2.4 中不可用。 @rayryeng 提供了一个lightweight alternative,它与DescriptorMatcher.match 的输出一样工作。与DescriptorMatcher.knnMatch 的区别在于匹配项以列表列表的形式返回。要使用@rayryeng 替代方案,必须将匹配项提取到一维列表中。

例如,Brute-Force Matching with SIFT Descriptors and Ratio Test 教程可以这样修改:

# 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:
       # Removed the brackets around m 
       good.append(m)

# Invoke @rayryeng's drawMatches alternative, note it requires grayscale images
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
drawMatches(gray1,kp1,gray2,kp2,good)

【讨论】:

  • 只是想说声谢谢。我已将此添加到我的原始帖子中以使其完整,并已将您链接到我的答案中。
【解决方案2】:

您需要使用 OpenCV 版本 3。drawMatchesKnn() 存在于 3.0.0-alpha 中,但不存在于 2.4.11

出现该错误,因为您使用的是旧版本的 OpenCV。

【讨论】:

    【解决方案3】:

    不要做good.append(m)试试good.append([m])

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 2019-01-17
      • 2018-01-08
      • 2019-07-03
      • 2011-03-15
      • 2013-09-04
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多