web-dev-qa-db-ja.com

TypeError:必須の引数 'outImg'(pos 6)が見つかりません

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を使用しています

35
shar

このチュートリアルページに続く (これに示したコードと2つの関連する質問- 12 に基づく)のようです。

関数のドキュメントはこちら (まだ「ベータ版」というラベルが付いていますが)であり、outImgはオプションであることを意味します。ただし、pythonエラーメッセージは明示的です-6桁目に引数が必要です。関数シグネチャのoutImgという名前です。ドキュメントがコードと完全に一致しない可能性がありますそれappearsの署名 C++コード pythonバインディング呼び出しているoutImgのデフォルト値がないため、その引数を指定する必要があります。

<function_name>.__doc__を見ると、python3インタープリター(存在する場合)で実際のバインディングのdocストリングを検査できることに注意してください。この場合、outImgはオプションとしてnotであることがわかります。ここに私のインストールからの出力があります:

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

解決策(注-LinuxではなくWindowsインストールで検証済み)

そのチュートリアルの最後の例 に注意してください。これは、次のコードを使用します。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 dictを渡す必要はありません。単にflagsを渡すことができます。

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

OpenCV 3の新規インストールでこれを確認しました(ただし、Windowsでは、ビルド済みのバイナリを使用)

65
J Richard Snape

大丈夫、私は初心者であり、オンラインで何時間も研究した後、多くのことを学びました。エラー(-255)NumpyAllocatorとして知られるエラーのバグのようです。多くのサイトはcv2.cppファイルを開いてコメントアウト163コード、OpenCV 3.0.1へのOpenCV 3.1ダウンロードグレードを使用している場合、私の提案です。

バグはこれに加えて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()

これがお役に立てば幸いです。私はスタックオーバーフローがインターネット上で最高のリソースであることを愛しています。

15
Wazzie

私のコード:img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, flags=2)

このコード、キーワードおよびparameter = "None"の後に機能しました:img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)

2
kcmn

これはおそらくバグです。できることは、6番目の引数をNoneとして渡すことができるということです。

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

SIFTで実験中 の場合、同様の問題が発生していました。 Noneを引数として使用すると、解決できました。

0
ymdatta