Reputation: 957
I wrote a program which gets matches between 2 pictures. And this is the code. but if I use BruteForceMatcher> (not flann) it works.
#include <stdio.h>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
void help()
{
printf("\nThis program demonstrates using features2d detector, descriptor extractor and simple matcher\n"
"Using the SURF desriptor:\n"
"\n"
"Usage:\n matcher_simple <image1> <image2>\n");
}
int main()
{
Mat img1 = imread("C:\\Users\\Hayk\\Desktop\\source1.bmp", CV_LOAD_IMAGE_GRAYSCALE);
Mat img2 = imread("C:\\Users\\Hayk\\Desktop\\source2.bmp", CV_LOAD_IMAGE_GRAYSCALE);
if(img1.empty() || img2.empty())
{
printf("Can't read one of the images\n");
return -1;
}
// detecting keypoints
SurfFeatureDetector detector(6000);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1);
detector.detect(img2, keypoints2);
// computing descriptors
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2);
// matching descriptors
FlannBasedMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
// drawing the results
namedWindow("matches", 1);
Mat img_matches;
drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
imshow("matches", img_matches);
waitKey(0);
return 0;
}
And this error I am getting after running the program
OpenCV Error: Assertion failed (dataset.type() == CvType<T>::type()) in unknown
function, file c:\Users\vp\work\ocv\opencv\modules\features2d\..\flann\include\o
pencv2/flann/flann.hpp, line 105
Can anyone say to me what I am doing wrong?
Upvotes: 1
Views: 1738
Reputation: 16197
You said it is works with the BruteForceMatcher but not Flann. I created a minimal example. Could you please run this and tell me, whether you get the same error that you got in your question?
Just trying to pin down the problem.
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main()
{
// Five descriptors with random values between 0 and 0.2
Mat descriptors(5, 64, CV_32FC1);
RNG rng;
rng.fill(descriptors, cv::RNG::UNIFORM, 0.0, 0.2);
// the query descriptor should yield a match in row 3 of the train descriptors
Mat query_descriptors;
query_descriptors.push_back(descriptors.row(3));
// Match using Brute Force. On your machine this should work.
BruteForceMatcher< L2<float> > brute_matcher;
vector<DMatch> matches;
brute_matcher.match(query_descriptors, descriptors, matches);
std::cout << "Brute Force Matcher: " << std::endl;
for(int i=0; i<matches.size(); ++i)
{
std::cout << matches[i].queryIdx << " <--> " << matches[i].trainIdx << std::endl;
}
// The code should fail here because we are now going to use the FlannBasedMatcher
std::cout << "Flann Based Matcher: " << std::endl;
FlannBasedMatcher matcher;
matcher.match(query_descriptors, descriptors, matches);
for(int i=0; i<matches.size(); ++i)
{
std::cout << matches[i].queryIdx << " <--> " << matches[i].trainIdx << std::endl;
}
return 0;
}
Upvotes: 1
Reputation: 93410
Your code works just fine on Linux with OpenCV 2.3.1a.
I've had several problems with the C++ OpenCV's interface for Windows. When I have to use Windows, I use the C interface.
Upvotes: 2