SLAM小白日记——OpenCV特征提取与匹配

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] );
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值