我正在尝试使用带有 opencv 的 SURF 来匹配 2 个图像之间的 SURF 点。一个是另一个的旋转。问题是它可以找到的少数匹配是错误的。
这是代码:
string imageName1="test_right_rotate.jpg";
string imageName2="test_right.jpg";
Mat image1 = imread( imageName1, 1 );
Mat image2 = imread( imageName2, 1 );
int minHessian = 500;
SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector->detect( image1, keypoints_1 );
detector->detect( image2, keypoints_2 );
SurfDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;
extractor.compute( image1, keypoints_1, descriptors_1 );
extractor.compute( image2, keypoints_2, descriptors_2 );
FlannBasedMatcher matcher;
std::vector<vector<DMatch > > matches;
matcher.knnMatch(descriptors_1,descriptors_2, matches, 2);
std::vector< DMatch > good_matches;
for(int i = 0; i < min(descriptors_1.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
{
if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
{
good_matches.push_back(matches[i][0]);
}
}
Mat img_matches;
drawMatches( image1, keypoints_1, image2, keypoints_2, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
它适用于缩放图像和翻译图像,但不适用于旋转图像。
编辑:
我不知道出了什么问题,但我没有使用 SURF,而是使用 ORB 作为检测器,使用 FREAK 作为提取器,它的效果要好得多。您可以在此 SO 上找到代码:https ://stackoverflow.com/questions/12491022/opencv-freak-fast-retina-keypoint-descriptor