Ошибка OpenCV python при использовании сопоставления функций изображений ORB

Я пытался сопоставить два изображения с помощью OpenCV ORB, как описано в этом руководстве. .

Вот мой код:

import numpy as np
import cv2
import six
import pyparsing
import dateutil
from matplotlib import pyplot as plt
import timeit
import os
import sys

img1_path  = 'img1.jpg'
img2_path  = 'img2.jpg'

img1 = cv2.imread(img1_path,0) # queryImage
img2 = cv2.imread(img2_path,0) # trainImage

orb = cv2.ORB()

kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

FLANN_INDEX_LSH = 6

index_params= dict(algorithm = FLANN_INDEX_LSH,
                   table_number = 6, # 12
                   key_size = 12,     # 20
                   multi_probe_level = 1) #2

search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params, search_params)

matches = flann.knnMatch(des1,des2,k=2)

if len(matches)>0:
    print "%d total matches found" % (len(matches))
else:
    print "No matches were found - %d" % (len(good))
    sys.exit()

# store all the good matches as per Lowe's ratio test.
good = []
for m,n in matches:
    if m.distance < 0.6*n.distance:
        good.append(m)

Я запустил этот скрипт с двумя очень похожими изображениями. В большинстве случаев скрипт работает нормально и находит совпадающие ключевые точки.

Однако в некоторых случаях я получаю эту ошибку (она относится к последним трем строкам кода):

Traceback (most recent call last):
    for m,n in matches:
ValueError: need more than 1 value to unpack

Это происходит, когда img2 значительно меньше изображения img1.

(если img2 — это исходное изображение, а img1 — измененные изображения, это означает, что кто-то добавил детали к исходному изображению).

Если я переключаюсь между именами файлов img1, img2, то скрипт запускается без проблем.

Изображение запроса (img1) должно быть меньше или равно изображению поезда (img2)?


person profirmatic    schedule 29.07.2014    source источник


Ответы (1)


Каждый член списка совпадений должен быть проверен, действительно ли существуют два соседа. Это не зависит от размеров изображения.

good = []
for m_n in matches:
  if len(m_n) != 2:
    continue
  (m,n) = m_n
  if m.distance < 0.6*n.distance:
    good.append(m)
person a99    schedule 02.09.2015