opencv/samples/cpp/brief_match_test.cpp

138 lines
4.4 KiB
C++
Raw Normal View History

/*
* matching_test.cpp
*
* Created on: Oct 17, 2010
* Author: ethan
*/
2011-08-10 16:56:27 +08:00
#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <vector>
#include <iostream>
using namespace cv;
2011-08-10 16:56:27 +08:00
using namespace std;
2010-11-24 10:35:10 +08:00
//Copy (x,y) location of descriptor matches found from KeyPoint data structures into Point2f vectors
void matches2points(const vector<DMatch>& matches, const vector<KeyPoint>& kpts_train,
const vector<KeyPoint>& kpts_query, vector<Point2f>& pts_train, vector<Point2f>& pts_query)
{
pts_train.clear();
pts_query.clear();
pts_train.reserve(matches.size());
pts_query.reserve(matches.size());
for (size_t i = 0; i < matches.size(); i++)
{
const DMatch& match = matches[i];
pts_query.push_back(kpts_query[match.queryIdx].pt);
pts_train.push_back(kpts_train[match.trainIdx].pt);
}
}
2010-12-21 19:37:08 +08:00
double match(const vector<KeyPoint>& /*kpts_train*/, const vector<KeyPoint>& /*kpts_query*/, DescriptorMatcher& matcher,
const Mat& train, const Mat& query, vector<DMatch>& matches)
{
2010-11-26 18:35:48 +08:00
double t = (double)getTickCount();
2010-11-24 10:35:10 +08:00
matcher.match(query, train, matches); //Using features2d
return ((double)getTickCount() - t) / getTickFrequency();
}
2011-08-10 16:56:27 +08:00
void help()
{
printf ("This program shows how to use BRIEF descriptor to match points in features2d\n"
"It takes in two images, finds keypoints and matches them displaying matches and final homography warped results\n"
"Usage: \n"
"image1 image2 \n"
"Example: \n"
"box.png box_in_scene.png \n");
}
2010-11-24 10:35:10 +08:00
2011-08-10 16:56:27 +08:00
const char* keys =
{
"{1| |box.png |the first image}"
"{2| |box_in_scene.png|the second image}"
};
2010-11-24 10:35:10 +08:00
2011-08-10 16:56:27 +08:00
int main(int argc, const char ** argv)
{
2011-08-10 16:56:27 +08:00
help();
CommandLineParser parser(argc, argv, keys);
string im1_name = parser.get<string>("1");
string im2_name = parser.get<string>("2");
Mat im1 = imread(im1_name, CV_LOAD_IMAGE_GRAYSCALE);
Mat im2 = imread(im2_name, CV_LOAD_IMAGE_GRAYSCALE);
if (im1.empty() || im2.empty())
{
2011-08-10 16:56:27 +08:00
printf( "could not open one of the images...\n");
printf("the cmd parameters have next current value: \n");
parser.printParams();
return 1;
}
double t = (double)getTickCount();
FastFeatureDetector detector(50);
2010-11-24 10:35:10 +08:00
BriefDescriptorExtractor extractor(32); //this is really 32 x 8 matches since they are binary matches packed into bytes
vector<KeyPoint> kpts_1, kpts_2;
detector.detect(im1, kpts_1);
detector.detect(im2, kpts_2);
t = ((double)getTickCount() - t) / getTickFrequency();
cout << "found " << kpts_1.size() << " keypoints in " << im1_name << endl << "fount " << kpts_2.size()
<< " keypoints in " << im2_name << endl << "took " << t << " seconds." << endl;
Mat desc_1, desc_2;
cout << "computing descriptors..." << endl;
t = (double)getTickCount();
extractor.compute(im1, kpts_1, desc_1);
extractor.compute(im2, kpts_2, desc_2);
t = ((double)getTickCount() - t) / getTickFrequency();
cout << "done computing descriptors... took " << t << " seconds" << endl;
2010-11-24 10:35:10 +08:00
//Do matching with 2 methods using features2d
cout << "matching with BruteForceMatcher<HammingLUT>" << endl;
BruteForceMatcher<HammingLUT> matcher;
vector<DMatch> matches_lut;
2010-12-21 19:37:08 +08:00
float lut_time = (float)match(kpts_1, kpts_2, matcher, desc_1, desc_2, matches_lut);
cout << "done BruteForceMatcher<HammingLUT> matching. took " << lut_time << " seconds" << endl;
cout << "matching with BruteForceMatcher<Hamming>" << endl;
BruteForceMatcher<Hamming> matcher_popcount;
vector<DMatch> matches_popcount;
double pop_time = match(kpts_1, kpts_2, matcher_popcount, desc_1, desc_2, matches_popcount);
cout << "done BruteForceMatcher<Hamming> matching. took " << pop_time << " seconds" << endl;
vector<Point2f> mpts_1, mpts_2;
2010-11-24 10:35:10 +08:00
matches2points(matches_popcount, kpts_1, kpts_2, mpts_1, mpts_2); //Extract a list of the (x,y) location of the matches
vector<uchar> outlier_mask;
2011-04-18 23:14:32 +08:00
Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask);
Mat outimg;
drawMatches(im2, kpts_2, im1, kpts_1, matches_popcount, outimg, Scalar::all(-1), Scalar::all(-1),
reinterpret_cast<const vector<char>&> (outlier_mask));
imshow("matches - popcount - outliers removed", outimg);
Mat warped;
2011-05-03 18:56:20 +08:00
Mat diff;
warpPerspective(im2, warped, H, im1.size());
imshow("warped", warped);
2011-05-03 18:56:20 +08:00
absdiff(im1,warped,diff);
imshow("diff", diff);
waitKey();
return 0;
}