2016-10-09 2 views
4

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

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 

ошибка похожа на this пост. Данное объяснение является неполным и неадекватным. Я хочу знать, как решить эту проблему. Я использовал дескрипторы 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.

+1

Всегда загружать полную информацию, без него воспроизведение вопроса будет сложнее. Изображения box.png и box_in_scene.png отсутствуют. – saurabheights

+0

Прости, я ложился спать. Я отредактировал вопрос. – motiur

+0

Итак, '.detectAndCompute' появляется из OpenCV 3x и выше? Я использую 2.4, и он говорит: «Объект модуля не найден» ... – alisa

ответ

4

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

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, как следует из названия, не имеет внутренней структуры, оптимизирующей поиск, и, таким образом, имеет пустой метод поезда.

Пример кода для поиска Multiple Image

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 см docs.

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

Другая информация

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

+0

Я использую его для нескольких изображений. Вышеприведенный код является простейшей версией. Код примера, который вы предоставили, отлично подходит для двух изображений. Я хочу сравнить дескриптор одного изображения с списком дескриптора нескольких изображений. Проблема здесь. – motiur

+0

Прости, я пропустил это. Дайте мне время, чтобы увидеть эту проблему. – saurabheights

+0

Думаю, я задаю этот вопрос: http://stackoverflow.com/questions/37731908/opencv2-batchdistance-error-215-when-looping-through-images-while-individual-co?rq=1 – motiur

Смежные вопросы