码迷,mamicode.com
首页 > 其他好文 > 详细

《视觉SLAM十四讲》课后习题—ch7(更新中……)

时间:2018-08-28 23:49:15      阅读:873      评论:0      收藏:0      [点我收藏+]

标签:cloc   对比   turn   ace   视觉   移动   tail   name   调用   

参考:https://blog.csdn.net/zilanpotou182/article/details/66478915SIFT、SURF、ORB三种特征点的区别

1.除了本书介绍的ORB特征点外,你还能找到哪些特征点?请说说SIFT或SURF的原理,并对比它们与ORB之间的优劣

  特征点:图像里一些特别的地方

  特征点的种类:SIFT、SURF、ORB、FAST

  SIFT算法充分考虑了在图像变换过程中出现的光照、尺度、旋转等变化,但是这会带来极大的计算量。

  SURF算法的速度远快于SIFT,SURF的鲁棒性很好,特征点识别率较SIFT高,在视角、光照、尺度变化等情形下,大体上都优于SIFT。

  ORB算法运算速度与前两者相比速度最快,但是这种算法尺度方面效果较差,因为ORB不具备尺度变换。

  定量比较:计算速度:ORB>>SURF>>SIFT(各差一个量级)

          旋转鲁棒性:SURF>ORB~SIFT(表示差不多)

          模糊鲁棒性: SURF>ORB~SIFT

          尺度变换鲁棒性: SURF>SIFT>ORB(ORB并不具备尺度变换性)

  综上,我们在选择特征点时的依据是如果对计算实时性要求非常高,可选用ORB算法,但基本要保证正对拍摄;如果对实行性要求稍高,可以选择SURF;基本不用SIFT

 

2.设计程序调用OpenCV中的其他种类特征点。统计在提取1000个特征点时在你的机器上的运行时间。

  首先我们要知道如果要调用opencv中的SIFT和SURF特征点,SIFT和SURF都在nonfree模块中,所以我们就需要nonfree模块。

  但是在opencv3中,SURF/SIFT 以及其它的一些东西被移动到了独立的库(opencv_contrib)中。

  所以首先我们需要安装opencv_contrib:(如果你用的是opencv2可以省略安装opencv_contrib这一步骤

  安装步骤见:安装opencv_contrib(ubuntu16.0)

  ORB、SIFT、SURF三种特征点提取方法的代码如下:

 1 #include <iostream>
 2 #include <opencv2/core/core.hpp>
 3 #include <opencv2/features2d/features2d.hpp>
 4 //#include <opencv2/nonfree/features2d.hpp>
 5 //#include <opencv2/nonfree/nonfree.hpp>//SIFT
 6 #include <opencv2/highgui/highgui.hpp>
 7 #include <opencv2/xfeatures2d/nonfree.hpp>//SIFT
 8 #include <chrono>
 9 
10 //using namespace xfeatures2d;
11 using namespace std;
12 using namespace cv;
13 
14 int main(int argc,char** argv)
15 {
16     if(argc!=2)
17     {
18         cout<<"usage:feature_extraction img1"<<endl;
19         return 1;
20     }
21 
22     //读取图像
23     Mat img_1=imread(argv[1],CV_LOAD_IMAGE_COLOR);
24 
25     //初始化
26     vector<KeyPoint> keypoints_1;//关键点,指特征点在图像里的位置
27 
28     //orb
29     chrono::steady_clock::time_point ORB_t1=chrono::steady_clock::now();
30     Ptr<ORB> orb=ORB::create(500,1.2f,8,31,0,2,ORB::HARRIS_SCORE,31,20);
31     chrono::steady_clock::time_point ORB_t2=chrono::steady_clock::now();
32     chrono::duration<double> ORB_time_used=chrono::duration_cast<chrono::duration<double>>(ORB_t2-ORB_t1);
33     cout<<"extract keypoints of ORB costs: "<<ORB_time_used.count()<<" seconds."<<endl;
34     orb->detect(img_1,keypoints_1);
35 
36     cout<<"KP1 = "<<keypoints_1.size()<<endl;//特征点的数量
37     Mat outimg1;
38     drawKeypoints(img_1,keypoints_1,outimg1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);
39     imshow("1.png的ORB特征点",outimg1);
40 
41 
42 //    //SIFT
43 //    chrono::steady_clock::time_point SIFT_t1=chrono::steady_clock::now();
44 //    Ptr<xfeatures2d::SiftFeatureDetector> siftDetector_1=xfeatures2d::SiftFeatureDetector::create();
45 //    siftDetector_1->detect(img_1,keypoints_1);
46 //    chrono::steady_clock::time_point SIFT_t2=chrono::steady_clock::now();
47 //    chrono::duration<double> SIFT_time_used=chrono::duration_cast<chrono::duration<double>>(SIFT_t2-SIFT_t1);
48 //    cout<<"extract keypoints of SIFT costs: "<<SIFT_time_used.count()<<" seconds."<<endl;
49 //    Mat outImg;
50 //    drawKeypoints(img_1,keypoints_1,outImg,Scalar::all(-1),DrawMatchesFlags::DEFAULT);
51 
52 //    cout<<"KP1 = "<<keypoints_1.size()<<endl;
53 //    imshow("1.png的SIFT特征点",outImg);
54 
55 //    //SURF
56 //    chrono::steady_clock::time_point SURF_t1=chrono::steady_clock::now();
57 //    Ptr<xfeatures2d::SurfFeatureDetector> surfDetector_1=xfeatures2d::SurfFeatureDetector::create();
58 //    surfDetector_1->detect(img_1,keypoints_1);
59 //    chrono::steady_clock::time_point SURF_t2=chrono::steady_clock::now();
60 //    chrono::duration<double> SURF_time_used=chrono::duration_cast<chrono::duration<double>>(SURF_t2-SURF_t1);
61 //    cout<<"extract keypoints of SURF costs: "<<SURF_time_used.count()<<" seconds."<<endl;
62 //    Mat outImg;
63 //    drawKeypoints(img_1,keypoints_1,outImg,Scalar::all(-1),DrawMatchesFlags::DEFAULT);
64 //    cout<<"KP1 = "<<keypoints_1.size()<<endl;
65 //    imshow("1.png的SURF特征点",outImg);
66     waitKey(0);
67 
68     return 0;
69 }

 

 

 

  实验结果:原始图像为:

                技术分享图片

 

     1) ORB

      技术分享图片   技术分享图片

     2) SIFT

      技术分享图片  技术分享图片

      3) SURF

      技术分享图片  技术分享图片

    分析:可见,计算速度是ORB最快,SURF次之,SIFT最慢。

    但是为什么基于同一张图片提取特征点,三种方法提取出的特征点数目不一样而且相差还很多呢?应该是因为三种方法的原理决定的吧。


 

《视觉SLAM十四讲》课后习题—ch7(更新中……)

标签:cloc   对比   turn   ace   视觉   移动   tail   name   调用   

原文地址:https://www.cnblogs.com/cc111/p/9457319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!