Подтвердить что ты не робот

TypeError: Требуемый аргумент 'outImg' (поз. 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

4b9b3361

Ответ 1

Вы, кажется, следуете этой странице руководства (на основе кода, который вы указали в этом и двух связанных с ним вопросах 1, 2).

Документация по функциям (хотя я отмечаю, что она по-прежнему помечена как "бета" ) и подразумевает, что outImg является необязательным. Однако сообщение об ошибке python является явным - в позиции 6 требуется аргумент, он называется outImg в сигнатуре функции. Я подозреваю, что документация может не соответствовать требованиям кода. Он показывает, что подпись кода С++, которую вызывает вызов python, не имеет значения по умолчанию для outImg, поэтому необходимо предоставить этот аргумент.

Обратите внимание, что вы можете проверить строку doc для фактической привязки в интерпретаторе python3 (если она существует), посмотрев на <function_name>.__doc__. В этом случае вы можете видеть, что 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_params dict, вы можете попробовать просто передать flags i.e.

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

Я проверил это при новой установке OpenCV 3 (хотя и в Windows, используя предварительно построенный двоичный файл)

Ответ 2

Хорошо, ребята, я слишком новичок и многому научился после нескольких часов исследований онлайн. Кажется, это ошибка BUG на ошибке, известная как Ошибка (-255) NumpyAllocator. Многие сайты предложит вам открыть файл cv2.cpp и комментарий вне кода линии 163, мое предложение заключается в том, что вы используете OpenCV 3.1 для загрузки в OpenCV 3.0.0

ошибка, кажется, в OpenCV 3.1, в дополнение к этому, код для использования алгоритма ORB, который документирован на OpenCV.org, немного устарел где говорится enter code here # Инициировать детектор ORB enter code here orb = cv2.ORB() # note, вы получите сообщение об ошибке, так как теперь enter code here изменить на: enter code here orb = cv2.ORB_create()

Вот мой пример кода с использованием OpenCV 3.0.0 в Windows 10:

  # 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()

Я надеюсь, что это поможет, я люблю стек. Поток его лучший ресурс в Интернете.