Соответствие 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 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.

  • Проблема: Сумка функций Обучение SIFT или SURF для обнаружения автомобиля в видео с OpenCV + Python
  • OpenCV Python не может использовать SURF, SIFT
  • Opencv 3.0 - объект модуля не имеет атрибута 'xfeatures2d'
  • OpenCV Объединение SURF с нейронной сетью
  • Есть ли у кого-нибудь примеры использования OpenCV с python для извлечения дескриптора?
  • OpenCV Python: иногда возникает ошибка сегментации при использовании FlannBasedMatcher
  • 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 - лучший язык программирования в мире.