Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:必需参数';outImg';(位置6)未找到_Python_Opencv_Opencv3.0 - Fatal编程技术网

Python TypeError:必需参数';outImg';(位置6)未找到

Python TypeError:必需参数';outImg';(位置6)未找到,python,opencv,opencv3.0,Python,Opencv,Opencv3.0,当我运行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.S

当我运行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()
我得到这个错误

TypeError: Required argument 'outImg' (pos 6) not found
我使用的是python3和opencv3,你似乎是(基于你在本文中展示的代码和你的两个相关问题)

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

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

>>> cv2.drawMatchesKnn.__doc__
'drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchC
olor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg'
解决方案(注意-在windows安装上验证,而不是在Linux上验证) 您可能会注意到,它使用以下代码-传入
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_参数
dict,您可以尝试传递
标志
,即

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

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

好吧,伙计们,我也是一个新手,经过数小时的在线研究,我学到了很多东西。这似乎是一个错误,称为错误(-255)NumpyAllocator,许多网站会建议你打开cv2.cpp文件并注释掉第163行代码,我的建议是,如果您正在使用OpenCV 3.1,请将grade下载到OpenCV 3.0.0

这个bug似乎在OpenCV 3.1中。此外,OpenCV.org上记录的使用ORB算法的代码有点过时 它说的地方
在此处输入代码
#启动ORB探测器
在此处输入代码
orb=cv2.orb()#注意,您将得到一个错误,因为现在这里输入代码
更改为:
在此处输入代码
orb=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()

我希望这会有帮助,我喜欢堆栈溢出,它是互联网上最好的资源

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

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

当时我也有类似的问题。当我使用
None
作为参数时,我能够解决这个问题。

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


在这个代码之后工作,keyword和parameter=“None”:
img3=cv2.drawMatches(img1,kp1,img2,kp2,matches,None,flags=2)

我想象outImg应该是一个numpy数组,它的签名是
cv2.drawMatches(img1,keypoints1,img2,keypoints2,matches1to2[,outImg[,matchColor[,singlePointColor[,matchesMask[,flags]])
因此,我认为如果您指定了
标志
,您还需要指定前面的所有参数,我认为文档是错误的/误导性的。我已经根据OP发现的问题创建了一个。一个旁注-工厂方法
cv2.BFMatcher\u create()
已经替换了默认的
cv2.BFMatcher()
,.NameError:name'matchesMask'没有定义好-老实说,这有点简洁。如果您尝试使用代码的第一个版本,即使用
draw_params
,那么您当然必须定义自己的
matchesMask
。但是,我立即给出了一个选项,该选项不需要您使用
draw_params
。将当前对
drawMatchesKnn()
的调用替换为我答案中的最后一行-忽略教程开头的引用代码
draw\u params
。为了完整起见,我将其包括在内,但我意识到这可能会令人困惑。另请参见我在回答您的另一个问题时给出的示例。在Linux Mint 17.3肉桂上验证,使用OpenCV 2.4.9 Lifesaver,@JRichardSnapeValidated使用macOS 10.12 Sierra和OpenCV 3.2.0。作品收到此错误:SystemError:返回NULL,但未设置错误谢谢。它可以在Linux上使用OpenCV 3和Python 3,但由于它对我有效,所以被否决了。
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2,None)