TypeError:找不到所需的参数“outImg”(位置 6)

Posted

技术标签:

【中文标题】TypeError:找不到所需的参数“outImg”(位置 6)【英文标题】:TypeError: Required argument 'outImg' (pos 6) not found 【发布时间】:2015-10-16 08:31:43 【问题描述】:

当我运行我的 python 代码时

import numpy as np
import cv2
import matplotlib.pyplot as plt

img1 = cv2.imread('/home/shar/home.jpg',0)          # queryImage
img2 = cv2.imread('/home/shar/home2.jpg',0) # trainImage

# Initiate SIFT detector

sift = cv2.xfeatures2d.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])

# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)


plt.imshow(img3),plt.show()

从这一行

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)

我收到此错误

TypeError: Required argument 'outImg' (pos 6) not found

我正在使用 python3 和 opencv3

【问题讨论】:

我想 outImg 应该是一个 numpy 数组 它的签名是cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches1to2[, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]])所以我想如果你指定flags你也需要指定所有前面的参数 我认为文档是错误的/具有误导性。我根据 OP 发现的问题创建了一个issue on opencv github。 附注 - 工厂方法 cv2.BFMatcher_create() 已替换默认的 cv2.BFMatcher()、according to the official documentation。 【参考方案1】:

您似乎是following this tutorial page(根据您在此显示的代码以及您的两个相关问题1、2)。

function documentation is here(尽管我注意到它仍被标记为“beta”)并暗示outImg 是可选的。但是,python 错误消息是明确的 - 位置 6 需要一个参数,它在函数签名中命名为 outImg。我怀疑文档可能不完全符合代码要求。 似乎 python 绑定正在调用的C++ code 的签名没有outImg 的默认值,因此需要提供该参数。

请注意,您可以通过查看&lt;function_name&gt;.__doc__ 在 python3 解释器(如果存在)中检查实际绑定的文档字符串。在这种情况下,您可以看到outImg 不是 显示为可选。这是我安装的输出:

>>> cv2.drawMatchesKnn.__doc__
'drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchC
olor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg'

解决方案(注意 - 在 Windows 安装上验证,而不是在 Linux 上验证)

您可能会注意到last example on that tutorial,它使用以下代码 - 传入None 代替outImg。我认为这也适用于您的情况。

draw_params = dict(matchColor = (0,255,0),
                   singlePointColor = (255,0,0),
                   matchesMask = matchesMask,
                   flags = 0)

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)

您不需要传递所有 draw_params 字典,您可以尝试只传递 flags

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)

我已经在全新安装的 OpenCV 3 上验证了这一点(尽管是在 Windows 上,使用预构建的二进制文件)

【讨论】:

NameError: name 'matchesMask' 没有定义 好的 - 说实话有点简洁。如果您尝试使用代码的第一个版本 - 即使用 draw_params,那么您当然必须定义自己的 matchesMask。但是,紧接着我给出了一个不需要您使用draw_params 的选项。用我回答中的最后一行替换您当前对drawMatchesKnn() 的调用 - 忽略教程中以draw_params 开头的引用代码。为了完整起见,我将其包括在内,但意识到这可能会令人困惑。另请参阅我在回答您的其他问题时给出的示例。 在 Linux Mint 17.3 Cinnamon 和 OpenCV 2.4.9 Lifesaver 上验证,@JRichardSnape 已通过 macOS 10.12 Sierra 和 OpenCV 3.2.0 验证。有效! 收到此错误:SystemError: 返回NULL但未设置错误【参考方案2】:

好的,伙计们,我也是新手,经过数小时的在线研究后学到了很多东西在第 163 行代码中,我的建议是如果您使用 OpenCV 3.1 下载等级到 OpenCV 3.0.0

除此之外,该错误似乎在 OpenCV 3.1 中,OpenCV.org 上记录的使用 ORB 算法的代码有点过时了 它在哪里声明 enter code here# 启动 ORB 检测器 enter code hereorb = cv2.ORB() # 注意你会得到一个错误,因为现在enter code here更改为: enter code hereorb = cv2.ORB_create()

这是我在 Windows 10 上使用 OpenCV 3.0.0 的代码示例:

  # Example of Brute Force matching base on ORB Algorithm
  #Modify Author : Waheed Rafiq R&D student Birmingham City University UK
  #Original author : OpenCV.org
  #Date Updated : 21/04/2016 : 13:45 

  import numpy as np
  import cv2
  from matplotlib import pyplot as plt 

  img1 = cv2.imread('wr-pb.jpg',0)          # queryImage
  img2 = cv2.imread('Waheed.jpg',0) # trainImage

  # Initiate ORB detector
  orb = cv2.ORB_create()

  # find the keypoints and descriptors with ORB
  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)

 # Sort them in the order of their distance.
 matches = sorted(matches, key = lambda x:x.distance)

 # Draw first 10 matches.
 img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)

 plt.imshow(img3),plt.show()

我希望这会有所帮助,我喜欢 stack Over flow,它是互联网上最好的资源。

【讨论】:

谢谢。它适用于具有 OpenCV 3 和 Python 3 的 Linux【参考方案3】:

我的代码:img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, flags=2)

在此代码、关键字和参数 =“None”之后工作:img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)

【讨论】:

【参考方案4】:

这可能是一个错误。您可以做的是您可以将第 6 个参数作为None 传递。

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2,None)

experimenting with SIFT 时我遇到了类似的问题。当我使用None 作为参数时,我能够解决它。

【讨论】:

不确定这是否对我有用。

以上是关于TypeError:找不到所需的参数“outImg”(位置 6)的主要内容,如果未能解决你的问题,请参考以下文章

Django python:使用 DateInput -- 找不到所需的参数“年份”(位置 1)

为啥好多东西运行不了。出现“找不到所需的.dll文件?”

找不到指令“...”所需的控制器“ngModel”

Teamcity:错误 MSB3147:找不到所需的文件“setup.bin”

找不到连接到本地数据文件所需的数据提供者

Flutter 报错 Kotlin 找不到所需的 JDK 工具