关于match:
如果直接用BruteForce类型的DescriptorMatcher,将会得到很多很多的匹配对(类似问题有Trying to match two images using sift in OpenCv, but too many matches)
这是因为该match将会为查询图的每一个描述子匹配一个最相近的训练图的描述子,也就是匹配对数目等于查询图的描述子数目。并没有挑选出最好的匹配。你应该从这些结果中进一步筛选。
如果你还不相信,你可以拿两幅毫无相关的图片,还是可以得到很多匹配对的。
原先代码:
<pre name="code" class="cpp"vector<DMatch> matches;descriptor_matcher->match( descriptors1, descriptors2, matches );Mat img_matches;drawMatches(img1,keypoints1,img2,keypoints2,matches,img_matches,Scalar::all(-1),CV_RGB(255,255,255),Mat(),4);加入筛选代码:
vector<DMatch> matches;
descriptor_matcher->match( descriptors1, descriptors2, matches );
double max_dist = 0; double min_dist = 100;
for(int i = 0; i < descriptors1.rows; i++) {
double dist = matches[i].distance;
if ( dist < min_dist ) min_dist = dist;
if ( dist > max_dist ) max_dist = dist;
}
vector<DMatch> good_matches;
for( int i = 0; i < descriptors1.rows; i++) {
if ( matches[i].distance <= max(2*min_dist, 0.02))
good_matches.push_back( matches[i] );
}
Mat img_matches;
drawMatches(img1,keypoints1,img2,keypoints2,good_matches,img_matches,Scalar::all(-1),CV_RGB(255,255,255),Mat(),4);
前后效果: