opencv-python: drawMatchesKnn () всегда возвращает NULL - PullRequest
0 голосов
/ 08 января 2019

Я хочу сделать простой проект по обнаружению логотипа. Поэтому я попытался следовать руководству по OpenCV-Python по обнаружению функций. OpenCV: соответствие функций

Я написал свой код, как показано ниже.

ratio = 0.8
logo = cv.imread("T01/CocaCola_logo2.png", cv.IMREAD_GRAYSCALE)
img = cv.imread("T01/CocaCola.png", cv.IMREAD_GRAYSCALE)

orb = cv.ORB_create()
kp_logo, des_logo = orb.detectAndCompute(logo, None)
kp_img, des_img = orb.detectAndCompute(img, None)

FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,
                    table_number=6,
                    key_size=12,
                    multi_probe_level=1)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
match_flann = flann.knnMatch(des_logo, des_img, k=2)

good = []
for p, q in match_flann:
    if p.distance > q.distance*ratio:
        good.append(p)

try:
    img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
    cv.drawMatchesKnn(logo, kp_logo, img, kp_img, good,
                      outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
    cv.imshow("flann matching", img_match)
    cv.waitKey(0)
except:
    print("...")

Этот код не работает должным образом. Процесс всегда обрабатывался по ошибке с помощью drawMatchesKnn (). Перед тем, как добавить в эту функцию попытку, кроме процесса, произошла системная ошибка: SystemError: вернул NULL без установки ошибки

В чем причина проблемы? Я долго пытался искать, но мне нелегко.


трассировка стека: Traceback (последний вызов был последним): Файл "C: /Users/choib/Desktop/openCVtest3/T01_ORBtest.py", строка 73, в cv.drawMatchesKnn (логотип, kp_logo, img, kp_img, хорошо, outImg = img_match, matchColor = None, singlePointColor = (255, 255, 255), flags = 2) SystemError: возвратил NULL без установки ошибки

1 Ответ

0 голосов
/ 09 января 2019

Я неправильно понял о drawMatches () и drawMatchesKnn (). ссылка

drawMatchesKnn () должен получить вектор, который составлен векторами DMatch как match1to2. Так что в моем случае я исправил код, как показано ниже.

вариант 1: использовать правильно

img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatches(logo, kp_logo, img, kp_img, good_flann,
               outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
cv.imshow("flann matching", img_match)
cv.waitKey(0)

вариант 2: использовать drawMatchesKnn ()

img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatchesKnn(logo, kp_logo, img, kp_img, match_flann,
                  outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
cv.imshow("flann matching", img_match)
cv.waitKey(0)

В этих кодах good_flann - это просто вектор DMatch. И match_flann - это вектор вектора. Так что у процесса нет проблем с этими частями.

...