1.定义特征提取器和描述子提取器:
cv::Ptr<cv::FeatureDetector> detector; cv::Ptr<cv::DescriptorExtractor> descriptor;
2.设置提取器的类型(ORB\SIFT\SURF)
detector=cv::FeatureDetector::create("ORB"); // 如果使用 sift, surf ,之前要初始化nonfree模块 // cv::initModule_nonfree(); // _detector = cv::FeatureDetector::create( "SIFT" ); // _descriptor = cv::DescriptorExtractor::create( "SIFT" ); descriptor = cv::DescriptorExtractor::create("ORB");
3.提取关键点
vector<cv::KeyPoint> kp1,kp2;//关键点
detector->detect(rgb1,kp1);//提取关键点
detector->detect(rgb2,kp2);//提取关键点
4.计算描述子
cv::Mat desp1, desp2; descriptor->compute( rgb1, kp1, desp1 ); descriptor->compute( rgb2, kp2, desp2 );
5.匹配描述子
vector< cv::DMatch > matches; cv::BFMatcher matcher; matcher.match( desp1, desp2, matches );
6.筛选匹配的特征点(去掉大于最小距离的二倍的匹配点)
// 筛选匹配,把距离太大的去掉 // 这里使用的准则是去掉大于2倍最小距离的匹配 vector< cv::DMatch > goodMatches; double minDis = 9999; for ( size_t i=0; i<matches.size(); i++ ) { if ( matches[i].distance < minDis ) minDis = matches[i].distance; }for ( size_t i=0; i<matches.size(); i++ ) { if (matches[i].distance < 2*minDis) goodMatches.push_back( matches[i] ); }