浅谈opencv库中的特征点提取与匹配(四)——ORB特征点提取详解

上篇博文中,小楼给大家介绍了SIFT特征点,这中特征点的优势固然明显,但随着带来的副作用也是巨大的.(老天爷从来都是公平的).那就是它巨大的计算量.目前来说,还没有那种cpu能够实时的计算SIFT特征点.
今天,介绍给大家一种相对来说更加完美的特征点–ORB特征.
ORB特征是近年来非常具有代表性的一种特征.它采用关键点和二进制描述子来对特征点进行判定与描述.下面为大家详细介绍ORB特征.
1. ORB特征由FAST关键点和BRIEF描述子构成,
其特征点的提取步骤分为FAST关键点的提取和BRIEF描述子的生成.
2.FAST关键点的提取:
FAST是一种角点,主要根据该点像素值与周围邻域像素点的像素值比较获得.主要检测灰度变化明显的地方.其提取步骤可以分为四部.
(1)读取检测点的灰度值I;
(2)设置一个阈值P(如I的120%);
(3)选取检测点的邻域像素;
(4)判断邻域像素点的灰度值是否大于阈值P,若连续n个邻域点的灰度值大于阈值,判定检测点为关键点 .
FAST关键点示意图BRIEF描述子:BRIEF描述子为一种二进制描述子,通过比较关键点与其邻域点像素值的大小.如邻域点像素值大于关键点像素值的话取0,否则取1.这样我们可以构建出一个128维的二进制向量来对关键点进行描述.就是因为ORB特征的描述子只需要比较大小,因此,它能保持很好的实时性.

接下来是ORB特征的提取实践,编写一个简单的小程序就可以实现这个功能.
运行环境:ubuntu16.04+opencv-3.1.0

 //初始化
  std::vector<KeyPoint> keypoints_1;
  Mat descriptors_1;
  
  //计时
  
  clock_t time_stt=clock();
  cout<<"< Extracting keypoints from images using ORB..."<<endl;
  Ptr<FeatureDetector> detector = ORB::create();
  detector->detect ( image,keypoints_1 );
  
  
  Ptr<DescriptorExtractor> descriptor = ORB::create();
  descriptor->compute ( image, keypoints_1, descriptors_1 );
  cout<<"image has"<<keypoints_1.size()<<"points"<<endl;
  cout<<"time use in ORB is"<<1000 * (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms" << endl;
  
  //绘制并保存特征点
  Mat out1;
  namedWindow("提取结果",CV_WINDOW_NORMAL);
  drawKeypoints( image, keypoints_1, out1, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
  imshow("提取结果",out1);
  imwrite("./orb.png",out1);

提取结果如下图所示:
ORB特征点提取提取个数与时间统计大家可以与上文的SIFT特征点进行对比,会发现提取时间大大减少了.这个时间也与电脑的性能有关,但是楼主用的是同一台老电脑.ORB特征的强大可见一斑!

全部代码留邮箱找楼主要,欢迎大家随时讨论!

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值