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を使用しています
このチュートリアルページに続く (これに示したコードと2つの関連する質問- 1 、 2 に基づく)のようです。
関数のドキュメントはこちら (まだ「ベータ版」というラベルが付いていますが)であり、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'
そのチュートリアルの最後の例 に注意してください。これは、次のコードを使用します。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では、ビルド済みのバイナリを使用)
大丈夫、私は初心者であり、オンラインで何時間も研究した後、多くのことを学びました。エラー(-255)NumpyAllocatorとして知られるエラーのバグのようです。多くのサイトはcv2.cppファイルを開いてコメントアウト163コード、OpenCV 3.0.1へのOpenCV 3.1ダウンロードグレードを使用している場合、私の提案です。
バグはこれに加えてOpenCV 3.1内にあるようです。OpenCV.orgで文書化されているORBアルゴリズムを使用するコードは、enter code here
#ORB検出器の開始enter code here
orb = cv2.ORB()#これでenter code here
への変更 : enter code here
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()
これがお役に立てば幸いです。私はスタックオーバーフローがインターネット上で最高のリソースであることを愛しています。
私のコード:img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, flags=2)
このコード、キーワードおよびparameter = "None"の後に機能しました:img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches ,None, flags=2)
これはおそらくバグです。できることは、6番目の引数をNone
として渡すことができるということです。
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2,None)
SIFTで実験中 の場合、同様の問題が発生していました。 None
を引数として使用すると、解決できました。