OpenCV2学习笔记(十三):基于SURF特征的图像匹配

本文介绍了如何利用OpenCV中的SURF算法进行图像特征检测与匹配。通过提取两幅图像的SURF特征点,使用BruteForceMatcher进行匹配,并筛选最佳匹配结果,最终实现可视化展示。在不同场景下,如图像缩放和角度变化,匹配效果表现出良好的鲁棒性。
摘要由CSDN通过智能技术生成

SURF算法是著名的尺度不变特征检测器SIFT(Scale-Invariant Features Transform)的高效变种,它为每个检测到的特征定义了位置和尺度,其中尺度的值可用于定义围绕特征点的窗口大小,使得每个特征点都与众不同。这里便是使用SURF算法提取两幅图像中的特征点描述子,并调用OpenCV中的函数进行匹配,最后输出一个可视化的结果,开发平台为Qt5.3.2+OpenCV2.4.9。以下给出图像匹配的实现步骤:

一、输入两幅图像,使用OpenCV中的cv::FeatureDetector接口实现SURF特征检测,在实际调试中改变阈值可获得不一样的检测结果:

    // 设置两个用于存放特征点的向量
    std::vector<cv::KeyPoint> keypoint1;
    std::vector<cv::KeyPoint> keypoint2;

    // 构造SURF特征检测器
    cv::SurfFeatureDetector surf(3000); // 阈值

    // 对两幅图分别检测SURF特征
    surf.detect(image1,keypoint1);
    surf.detect(image2,keypoint2);

二、OpenCV 2.0版本中引入一个通用类,用于提取不同的特征点描述子。在这里构造一个SURF描述子提取器,输出的结果是一个矩阵,它的行数与特征点向量中的元素个数相同。每行都是一个N维描述子的向量。在SURF算法中,默认的描述子维度为64,该向量描绘了特征点周围的强度样式。两个特征点越相似,它们的特征向量也就越接近,因此这些描述子在图像匹配中十分有用:

    cv::SurfDescriptorExtractor surfDesc;

    // 对两幅图像提取SURF描述子
    cv::Mat descriptor1, descriptor2;
    surfDesc.compute(image1,keypoint1,descriptor1);
    surfDesc.compute(image2,keypoint2,descriptor2);

提取出两幅图像各自的特征点描述子后,需要进行比较(匹配)。可以调用OpenCV中的类cv::BruteForceMatcher构造一个匹配器。cv::BruteForceMatcher是类cv::DescriptorMatcher的一个子类,定义了不同的匹配策略的共同接口,结果返回一个cv::DMatch向量,它将被用于表示一对匹配的描述子。(关于cv::BruteForceMatcher 请参考: http://blog.csdn.net/panda1234lee/article/details/11094483?utm_source=tuicool

三、在一批特征点匹配结果中筛选出评分(或者称距离)最理想的25个匹配结果,这通过std::nth_element实现。

void nth_element(_RandomAccessIterator _first, _RandomAccessIterator _nth, _RandomAccessIterator _last)  

该函数的作用为将迭代器指向的从_first 到 _last 之间的元素进行二分排序,以_nth 为分界,前面都比 _Nth 小(大),后面都比之大(小),因此适用于找出前n个最大(最小)的元素。

四、最后一步,将匹配的结果可视化。OpenCV提供一个绘制函数以产生由两幅输入图像拼接而成的图像,而匹配的点由直线相连:

    // 以下操作将匹配结果可视化
    cv::Mat imageMatches;
    cv::drawMatches(image1,keypoint1,  // 第一张图片和检测到的特征点
                    image2,keypoint2,  // 第二张图片和检测到的特征点
                    matches,          
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值