Ask Your Question
0

Running into an error using cv::BFMatcher (bruteforce matcher) with 10,100 training images

asked 2013-02-07 13:22:17 -0500

bfmatcher_hurts gravatar image bfmatcher_hurts
6 3

updated 2013-02-08 07:36:58 -0500

I'm implementing a simple bag-of-words matching system, where I have 10,100 "clusters" and I am trying to match a single feature vector to the closest cluster. This works for a smaller number of clusters, but I need it to work for this larger set.

Essentially, I put all 10,100 clusters into a vector of cv::Mat objects, each of which is 1 x 16. Then, I add these to the BFMatcher as follows:

cv::BFMatcher matcher(cv::NORM_HAMMING);
bf_matcher.add(clusters_for_matching);

Finally, given a new 1 x 16 feature vector to match, I do the following:

std::vector<cv::DMatch> matches;
bf_matcher.match(feature_vector, matches);

The error I get is the following:

OpenCV Error: Assertion failed ((int64)imgCount*IMGIDX_ONE < INT_MAX) in unknown function, file ......\src\opencv\modules\features2d\src\matchers.cpp, line 360

My question is simple, what is going on and how can I make this work? It's pretty clear that for some reason it considers 10,100 to be too many training instances, but that is extremely small in comparison to some other applications.

delete close flag offensive retag edit

Comments

Just out of curiosity: How do you cluster your binary features?

Guanta ( 2013-02-09 09:10:53 -0500 )edit

@Guanta You can cluster binary features with k-means, using hamming distance as the distance metric (you can't do that with OpenCV's k-means, but it's pretty easy to code yourself). I'm trying a few different approaches out

bfmatcher_hurts ( 2013-02-11 09:18:24 -0500 )edit

Okay, but what how do you compute the means of binary vectors? Or do you take then the median?

Guanta ( 2013-02-12 04:15:24 -0500 )edit

1 Answer

Sort by ยป oldest newest most voted
1

answered 2013-02-09 09:09:50 -0500

Guanta gravatar image Guanta
4327 10 40

Hmm, very weired, I am doing nearly the same without a problem. So let's look at matchers.cpp: imgCount would be the numbers of clusters, i.e. 10100 in your case. According to matchers.cpp IMGIDX_ONE = (1 << 18) = 2^18 = 262144. So 10100*262144 = 2 647 654 400. If INT_MAX is 2^31 - 1 = 2 147 483 647 the assertion fails. However, depending on your system and the compiler you use, see http://stackoverflow.com/questions/9257065/int-max-in-32-bit-vs-64-bit-environment, INT_MAX can vary. I'm not very sure about the meaning of this assertion, but maybe this assertion could be changed to UINT_MAX then you wouldn't have a problem, i.e. changing INT_MAX to UINT_MAX in matchers.cpp and recompiling opencv may solve your problem for now.

link delete flag offensive edit

Comments

Very strange. This must be it. I'm currently using the windows superpack, so I guess I'll have to go recompile my own opencv binaries, but what you wrote looks reasonable. It seems like such an odd requirement. In the meantime, I wrote my own brute-force matcher and it has no such requirements. I'm not sure why that assertion would exist. Thanks

bfmatcher_hurts ( 2013-02-11 09:20:58 -0500 )edit

Login/Signup to Answer

Question tools

Follow

subscribe to rss feed

Stats

Asked: 2013-02-07 13:22:17 -0500

Seen: 289 times

Last updated: Feb 09 '13