I am using SURF descriptors for image matching. I am planning to match a given image to a database of images.
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)
The issue is with bf.match
is that I am getting the following error:
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
The error is similar to this post. The explanation given is incomplete and inadequate.I want to know how to resolve this issue. I have used ORB descriptors as well with BFMatcher having NORM_HAMMING
distance. The error resurfaces.
Any help will be appreciated.
The two images that I have used for this are:
box.png
box_in_scene.png
I am using Python 3.5.2 and OpenCV 3.1.x in linux.
To search between descriptors of two images use:
To search among multiple images
The
add
method is used to add descriptor of multiple test images. Once, all descriptors are indexed, you runtrain
method to build an underlying Data Structure(example: KdTree which will be used for searching in case of FlannBasedMatcher). You can then runmatch
to find if which test image is a closer match to which query image. You can check K-d_tree and see how it can be used to search for multidimensional vectors(Surf gives 64-dimensional vector).Note:- BruteForceMatcher, as name implies, has no internal search optimizing data structure and thus has empty train method.
Code Sample for Multiple Image search
For DMatch output of bf.match, see docs.
See full example for this here: Opencv3.0 docs.
Other Info
OS: Mac.
Python: 2.7.10.
Opencv: 3.0.0-dev [If remember correctly, installed using brew].
I found I was getting the same error. Took a while to figure out - some of my images were somewhat featureless, therefore no keypoints were found, and
detectAndCompute
returnedNone
for the descriptors. Might be worth checking the list of descriptors forNone
elements prior to passing toBFMatcher.add()
.Edit: Versions used Python 3.6, OpenCV 3.4.1
I struggled a lot while preparing a program that uses SIFT or ORB depending on user's choice. Finally, i could find correct parameters for BFMatcher for SIFT and ORB
Creating matcher object
While capturing and processing frames
I was getting the same error. But in my case it was because I was using SIFT with
cv2.NORM_HAMMING
metric incv2.BFMatcher_create
. Changing the metric tocv2.NORM_L1
solved the issue.Citing docs for BFMatcher: