1. 程式人生 > >Python3 TypeError: Required argument 'outImg' (pos 6) not found

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

問題:在用python3使用img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)的時候,可能會產生錯誤:TypeError: Required argument 'outImg' (pos 6) not found

import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('data/queryImage.jpg', 0)  # queryImage
img2 = cv2.imread('data/trainImage.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)
....

報錯資訊:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-54-8a7d0ce88553> in <module>()
     18         good.append([m])
     19 # cv2.drawMatchesKnn expects list of lists as matches.
---> 20 img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
     21 plt.imshow(img3),plt.show()

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

解決:將img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2) 替換為:

          img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) 即:如果沒有outImg引數則傳入None。

分析:

        在最後一個demo中:是將outImg引數以None的形式傳入。

import cv2
cv2.drawMatchesKnn?
------------------------------------------------------------------------------------------------------
Docstring:
drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg
.   @overload
Type:      builtin_function_or_method


demo:
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)


        在python3中,如果沒有outImg引數則傳入None就沒問題了。

變更樣例:

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

 可參考文章:https://www.e-learn.cn/content/wangluowenzhang/309127

說明:問題產生的環境
  Python版本:3.6.5
  OpenCV版本:3.4.2