Почему я получаю недостаточно значений для распаковки (ожидается 2, получено 1) для некоторых изображений? - PullRequest
1 голос
/ 26 июня 2019
import cv2
import numpy as np
import sys
from IPython.display import Image
from matplotlib import pyplot as plt
import numpy
import os


img = cv2.imread('C:\\Users\\not-cropped.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

search_params = dict(checks = 50)

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



# Initiate STAR detector
star = cv2.xfeatures2d.StarDetector_create()
# Initiate BRIEF extractor
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()

# find the keypoints with STAR
kp_brief_o = star.detect(gray,None)

# compute the descriptors with BRIEF
kp_brief_o, des_brief_o = brief.compute(gray, kp_brief_o)


img66 = cv2.drawKeypoints(gray,kp_brief_o,None,(255,0,0),4)
plt.imshow(img66),plt.show()
##########################################################33
gray_crop = cv2.imread('C:\\Users\\cropped.jpg', 0)

kp_brief_crop = star.detect(gray_crop,None)

kp_brief_crop, des_brief_crop = brief.compute(gray_crop, kp_brief_crop)

flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des_brief_o, des_brief_crop, k=2)

good = []
for m,n in matches:
    if m.distance < 0.7*n.distance:
    good.append(m)

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

Ошибка:

ValueError Traceback (most recent call last)
<ipython-input-56-9685f4afabba> in <module>
     44 
     45 good = []
---> 46 for m,n in matches:
     47     if m.distance < 0.7*n.distance:
     48         good.append(m)

ValueError: недостаточнозначения для распаковки (ожидается 2, получено 1)

изображения:

главное

main

обрезано

cropped

несвязанный рис, где я все еще получил бы ошибку

unrelated pic where i'd still get the error

1 Ответ

0 голосов
/ 27 июня 2019

Звучит так, будто ты не получаешь спичек обратно.Постарайтесь убедиться, что у вас есть ключевые точки.Может быть, вы можете проверить, что len(des_brief_o) и len(des_brief_crop) возвращают.Я предполагаю, что matches в этом случае None.

Итак, я запустил ваш код и у меня возникла та же проблема:

for m in matches:
    print(m)

И некоторые совпадения содержат только один элемент или ни одного.

...
[<DMatch 0x10e6b93f0>, <DMatch 0x10e6b9410>]
[<DMatch 0x10e6b9430>, <DMatch 0x10e6b9450>]
[<DMatch 0x10e6b9470>, <DMatch 0x10e6b9490>]
[<DMatch 0x10e6b94b0>, <DMatch 0x10e6b94d0>]
[]
[<DMatch 0x10e6b94f0>, <DMatch 0x10e6b9510>]
[<DMatch 0x10e6b9530>, <DMatch 0x10e6b9550>]
[<DMatch 0x10e6b9570>, <DMatch 0x10e6b9590>]
[]
[<DMatch 0x10e6b95b0>, <DMatch 0x10e6b95d0>]
[<DMatch 0x10e6b95f0>]
[<DMatch 0x10e6b9610>, <DMatch 0x10e6b9630>]
...

Почему бы не пропуститьрезультатов нет или найдено только одно совпадение:

good = []
for m in matches:
    if len(m) == 2:
       if m[0].distance < 0.7 * m[1].distance:
          good.append(m[0])
...