利用OpenCV中的SIFT、SURF和ORB分别提取图像特征

最近看大佬的书,《机器人SLAM导航核心技术与实战》,里面涉及特征点的提取有多种算法, 写的很详细,也有很多大佬已经梳理了原理,如果想学习,可以参考以下资料:

https://github.com/xiihoo/Books_Robot_SLAM_Navigation

https://blog.csdn.net/qq_38338086/article/details/121673036

我这里就是实现一下,跑一下结果,看看效果。需要注意的是SIFT、SURF被封装在了opencv_contrib里面。在使用方面没有大的区别,简单的测试代码如下:

#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
  
using namespace std;
using namespace cv;
  
int main(int argc, char** argv) {
     
    cv::Mat img = cv::imread("../data/1311875572.606060.png", CV_LOAD_IMAGE_GRAYSCALE);
 
    cv::Mat out_img,des;
    vector<cv::KeyPoint> pts;

    // SURF特征点检测
	Ptr<xfeatures2d::SURF> surf = xfeatures2d::SURF::create();//创建一个surf类对象并初始化
	surf->detect(img, pts, Mat());//找出关键点

    // // ORB特征点检测
	// Ptr<ORB> orb = ORB::create();
	// orb->detect(img, pts, Mat());

    // // SIFT特征点检测
    // Ptr<xfeatures2d::SIFT> sift=cv::xfeatures2d::SIFT::create();
    // sift->detect(img,pts,des);

	drawKeypoints(img, pts, out_img);
    cv::imshow("Image", out_img);
    // cv::imwrite("SURF.png",out_img);
    cv::waitKey(0);
    return 0;
 }

结果如下:

SIFT 速度很慢,提取的特征点质量比较高

SURF 速度一般,特征点的数量最多

ORB 速度很快,特征点的数量最少

综合评价:

计算速度: ORB>>SURF>SIFT
旋转鲁棒性: SURF>ORB~SIFT
模糊鲁棒性: SURF>ORB~SIFT
尺度变换鲁棒性: SURF>SIFT>ORB(ORB尺度变换性很弱)
在日常应用中,有SURF基本就不用考虑SIFT,SURF基本就是SIFT的全面升级版,当然也有其他SIFT的改进版比如Affine SIFT的效果就要比SUFR要好更多,但是计算时间也有延长,而ORB的强点在于计算时间。ORB主要还是在VSLAM中应用较多,场景变化不明显,但是需要高速的计算时间,这正好符合ORB。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值