Соответствие BFMatcher в ошибке запуска OpenCV

Я использую дескрипторы SURF для сопоставления изображений. Я планирую сопоставить данный образ с базой данных изображений.

import cv2 import numpy as np surf = cv2.xfeatures2d.SURF_create(400) img1 = cv2.imread('box.png',0) img2 = cv2.imread('box_in_scene.png',0) kp1,des1 = surf.detectAndCompute(img1,None) kp2,des2 = surf.detectAndCompute(img2,None) bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=True) #I am planning to add more descriptors bf.add(des1) bf.train() #This is my test descriptor bf.match(des2) 

Проблема с bf.match заключается в том, что я получаю следующую ошибку:

  • В чем разница между всеми этими интерфейсами OpenCV Python?
  • Сравнение производительности интерфейсов OpenCV-Python, cv и cv2
  • OCR текста с низким разрешением из скриншотов
  • OpenCV Python Bindings для алгоритма GrabCut
  • Python OpenCV: Обнаружение общего направления движения?
  • Возможно ли в OpenCV построить локальную кривизну в виде тепловой карты, представляющей «интересность» объекта?
  •  OpenCV Error: Assertion failed (type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U)) in batchDistance, file /build/opencv/src/opencv-3.1.0/modules/core/src/stat.cpp, line 3749 Traceback (most recent call last): File "image_match4.py", line 16, in <module> bf.match(des2) cv2.error: /build/opencv/src/opencv-3.1.0/modules/core/src/stat.cpp:3749: error: (-215) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) in function batchDistance 

    Ошибка похожа на эту запись. Данное объяснение является неполным и неадекватным. Я хочу знать, как решить эту проблему. Я использовал ORB-дескрипторы, а BFMatcher имеет NORM_HAMMING расстояние. Ошибка возникает. Любая помощь будет оценена.

    Два изображения, которые я использовал для этого:

    box.png

    box.png

    box_in_scene.png

    box_in_scene.png

    Я использую Python 3.5.2 и OpenCV 3.1.x в Linux.

  • От JPG до b64encode до cv2.imread ()
  • Команда cv2.imshow не работает должным образом в opencv-python
  • как получить кадры из видео параллельно с использованием cv2 и многопроцессорности в python
  • Извлечение области из изображения с использованием среза в Python, OpenCV
  • Python Opencv SolvePnP дает неверный вектор перевода
  • cv2 3.0.0 cv2.FlannBasedMatcher: flann.knnMatch бросает ошибку cv2
  • One Solution collect form web for “Соответствие BFMatcher в ошибке запуска OpenCV”

    Для поиска между дескрипторами двух изображений используйте:

     img1 = cv2.imread('box.png',0) img2 = cv2.imread('box_in_scene.png',0) kp1,des1 = surf.detectAndCompute(img1,None) kp2,des2 = surf.detectAndCompute(img2,None) bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=False) matches = bf.match(des1,des2) 

    Чтобы выполнить поиск среди нескольких изображений

    Метод add используется для добавления дескриптора нескольких тестовых изображений. Однажды все дескрипторы индексируются, вы запускаете метод train для построения базовой структуры данных (пример: KdTree, который будет использоваться для поиска в случае FlannBasedMatcher). Затем вы можете выполнить match чтобы определить, является ли какое тестовое изображение более близким к какому образ запроса. Вы можете проверить K-d_tree и посмотреть, как его можно использовать для поиска многомерных векторов (Surf дает 64-мерный вектор).

    Примечание. – BruteForceMatcher, как следует из названия, не имеет внутренней структуры, оптимизирующей поиск, и, таким образом, имеет пустой метод поезда.

    Образец кода для поиска нескольких изображений

     import cv2 import numpy as np surf = cv2.xfeatures2d.SURF_create(400) # Read Images train = cv2.imread('box.png',0) test = cv2.imread('box_in_scene.png',0) # Find Descriptors kp1,trainDes1 = surf.detectAndCompute(train, None) kp2,testDes2 = surf.detectAndCompute(test, None) # Create BFMatcher and add cluster of training images. One for now. bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=False) # crossCheck not supported by BFMatcher clusters = np.array([trainDes1]) bf.add(clusters) # Train: Does nothing for BruteForceMatcher though. bf.train() matches = bf.match(testDes2) matches = sorted(matches, key = lambda x:x.distance) # Since, we have index of only one training image, # all matches will have imgIdx set to 0. for i in range(len(matches)): print matches[i].imgIdx 

    Для выхода DMatch для bf.match см. Документы .

    Полный пример приведен здесь: Opencv3.0 docs .

    Дополнительная информация

    ОС: Mac.
    Python: 2.7.10.
    Opencv: 3.0.0-dev [Если правильно помнить, установлен с использованием варева].

    Python - лучший язык программирования в мире.