视觉SLAM十四讲CH7课后习题2

转载于:

视觉SLAM十四讲(第二版)第7讲习题解答 - 知乎大家好,这里是Philip~最近在学习高博的《视觉SLAM十四讲》(第二版),以下是对第7讲习题的解答,如有错误或不全面的地方还请大家指正。 1. 除了本书介绍的ORB特征点,你还能找到哪些特征点?请说说SIFT或SURF的…https://zhuanlan.zhihu.com/p/389420864我重新建立了一个文件夹:

在原作者的基础上添加了详细的注释

 orb_cv.cpp

#include <iostream>
#include <opencv2/core/core.hpp>
//#include <opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>//sift 和surf特征点提取所需头文件
#include <opencv2/highgui/highgui.hpp>//opencv gui模块
#include <chrono>

using namespace std;
using namespace cv;

int main(int argc, char **argv) {
  if (argc != 2) {
    cout << "usage: feature_extraction img" << endl;//输出命令行用法
    return 1;
  }
  //-- 读取图像
  Mat img = imread(argv[1], CV_LOAD_IMAGE_COLOR);//读取图像 CV_LOAD_IMAGE_COLOR表示返回的是彩色图像
  assert(img.data != nullptr);//assert()为断言函数,条件为假则停止执行

  //-- 初始化
  std::vector<KeyPoint> keypoints_orb,keypoints_sift,keypoints_surf,keypoints_kaze;//ORB SIFT SURF KAZE
  Ptr<FeatureDetector> detector_orb = ORB::create(1000);//检测1000个ORB点
  Ptr<FeatureDetector> detector_sift= SIFT::create(1000);//检测1000个SIFT点
  Ptr<FeatureDetector> detector_surf= xfeatures2d::SURF::create(400);//检测1000个SURF点
  Ptr<FeatureDetector> detector_kaze= KAZE::create(1000);//检测1000个KAZE点

  //-- Orb特征点
  chrono::steady_clock::time_point t1 = chrono::steady_clock::now();//计时开始
  detector_orb->detect(img, keypoints_orb);//ORB特征点提取
  chrono::steady_clock::time_point t2 = chrono::steady_clock::now();//计时结束
  chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_orb.size()<<endl;//输出ORB特征点数
  cout<<"time of orb="<<time_used.count()<<endl;//输出ORB提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_orb;//定义输出图像名称
  drawKeypoints(img,keypoints_orb, outimg_orb, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出特征点
  imshow("ORB features", outimg_orb);//界面显示ORB特征点提取结果
  
  //-- Sift特征点
  t1 = chrono::steady_clock::now();//计时开始
  detector_sift->detect(img, keypoints_sift);//SIFT特征点提取
  t2 = chrono::steady_clock::now();//计时结束
  time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_sift.size()<<endl;//输出SIFT特征点数
  cout<<"time of sift="<<time_used.count()<<endl;//输出SIFT提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_sift;//定义输出图像名称
  drawKeypoints(img,keypoints_sift, outimg_sift, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出SIFT特征点
  imshow("SIFT features", outimg_sift);//界面显示SIFT特征点提取结果
  
  //-- Surf特征点
  t1 = chrono::steady_clock::now();//计时开始
  detector_surf->detect(img, keypoints_surf);//SURF特征点提取
  t2 = chrono::steady_clock::now();//计时结束
  time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_surf.size()<<endl;//输出SURF特征点数
  cout<<"time of surf="<<time_used.count()<<endl;//输出SURF提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_surf;//定义输出图像名称
  drawKeypoints(img,keypoints_surf, outimg_surf, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出SURF特征点
  imshow("SURF features", outimg_surf);//界面显示SURF特征点提取结果
  
  //-- Kaze特征点
  t1 = chrono::steady_clock::now();//计时开始
  detector_surf->detect(img, keypoints_kaze);//KAZE特征点提取
  t2 = chrono::steady_clock::now();//计时结束
  time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_kaze.size()<<endl;//输出KAZE特征点数
  cout<<"time of kazef="<<time_used.count()<<endl;//输出KAZE提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_kaze;//定义输出图像名称
  drawKeypoints(img,keypoints_kaze, outimg_kaze, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出KAZE特征点
  imshow("KAZE features", outimg_kaze);//界面显示SIFT特征点提取结果
  
  waitKey(0);

  
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(ch7_1)

set(CMAKE_BUILD_TYPE "Release")
add_definitions("-DENABLE_SSE")
#set(CMAKE_CXX_FLAGS "-std=c++11 -O2 ${SSE_FLAGS} -msse4")
set(CMAKE_CXX_FLAGS "-std=c++14 -O2 ${SSE_FLAGS} -msse4") 

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

find_package(OpenCV 3 REQUIRED)
find_package(G2O REQUIRED)
find_package(Sophus REQUIRED)

include_directories(
        ${OpenCV_INCLUDE_DIRS}
        ${G2O_INCLUDE_DIRS}
        ${Sophus_INCLUDE_DIRS}
        "/usr/local/include/eigen3/"
       
)

add_executable(orb_cv orb_cv.cpp)
target_link_libraries(orb_cv ${OpenCV_LIBS} )

add_executable(orb_cv1 orb_cv1.cpp)
target_link_libraries(orb_cv1 ${OpenCV_LIBS} )


add_executable(orb_cv2 orb_cv2.cpp)
target_link_libraries(orb_cv2 ${OpenCV_LIBS} )

执行结果:

./orb_cv 1.jpg
number of keypoints=1000
time of orb=0.00840032
***************************************
number of keypoints=1001
time of sift=0.0535068
***************************************
number of keypoints=2148
time of surf=0.0142542
***************************************
number of keypoints=2148
time of kazef=0.0243749
***************************************

 

 

 

 

将特征点增加后:

 orb_cv1.cpp:

#include <iostream>
#include <opencv2/core/core.hpp>
//#include <opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>//sift 和surf特征点提取所需头文件
#include <opencv2/highgui/highgui.hpp>//opencv gui模块
#include <chrono>

using namespace std;
using namespace cv;

int main(int argc, char **argv) {
  if (argc != 2) {
    cout << "usage: feature_extraction img" << endl;//输出命令行用法
    return 1;
  }
  //-- 读取图像
  Mat img = imread(argv[1], CV_LOAD_IMAGE_COLOR);//读取图像 CV_LOAD_IMAGE_COLOR表示返回的是彩色图像
  assert(img.data != nullptr);//assert()为断言函数,条件为假则停止执行

  //-- 初始化
  std::vector<KeyPoint> keypoints_orb,keypoints_sift,keypoints_surf,keypoints_kaze;//ORB SIFT SURF KAZE
  Ptr<FeatureDetector> detector_orb = ORB::create(5000);//检测5000个ORB点
  Ptr<FeatureDetector> detector_sift= SIFT::create(5000);//检测5000个SIFT点
  Ptr<FeatureDetector> detector_surf= xfeatures2d::SURF::create(100);//检测5000个SURF点
  Ptr<FeatureDetector> detector_kaze= KAZE::create(200);//检测5000个KAZE点

  //-- Orb特征点
  chrono::steady_clock::time_point t1 = chrono::steady_clock::now();//计时开始
  detector_orb->detect(img, keypoints_orb);//ORB特征点提取
  chrono::steady_clock::time_point t2 = chrono::steady_clock::now();//计时结束
  chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_orb.size()<<endl;//输出ORB特征点数
  cout<<"time of orb="<<time_used.count()<<endl;//输出ORB提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_orb;//定义输出图像名称
  drawKeypoints(img,keypoints_orb, outimg_orb, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出特征点
  imshow("ORB features", outimg_orb);//界面显示ORB特征点提取结果
  
  //-- Sift特征点
  t1 = chrono::steady_clock::now();//计时开始
  detector_sift->detect(img, keypoints_sift);//SIFT特征点提取
  t2 = chrono::steady_clock::now();//计时结束
  time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_sift.size()<<endl;//输出SIFT特征点数
  cout<<"time of sift="<<time_used.count()<<endl;//输出SIFT提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_sift;//定义输出图像名称
  drawKeypoints(img,keypoints_sift, outimg_sift, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出SIFT特征点
  imshow("SIFT features", outimg_sift);//界面显示SIFT特征点提取结果
  
  //-- Surf特征点
  t1 = chrono::steady_clock::now();//计时开始
  detector_surf->detect(img, keypoints_surf);//SURF特征点提取
  t2 = chrono::steady_clock::now();//计时结束
  time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_surf.size()<<endl;//输出SURF特征点数
  cout<<"time of surf="<<time_used.count()<<endl;//输出SURF提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_surf;//定义输出图像名称
  drawKeypoints(img,keypoints_surf, outimg_surf, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出SURF特征点
  imshow("SURF features", outimg_surf);//界面显示SURF特征点提取结果
  
  //-- Kaze特征点
  t1 = chrono::steady_clock::now();//计时开始
  detector_surf->detect(img, keypoints_kaze);//KAZE特征点提取
  t2 = chrono::steady_clock::now();//计时结束
  time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);//计算用时
  cout<<"number of keypoints="<<keypoints_kaze.size()<<endl;//输出KAZE特征点数
  cout<<"time of kaze ="<<time_used.count()<<endl;//输出KAZE提取耗时
  cout<<"***************************************"<<endl;
  
  Mat outimg_kaze;//定义输出图像名称
  drawKeypoints(img,keypoints_kaze, outimg_kaze, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//画出KAZE特征点
  imshow("KAZE features", outimg_kaze);//界面显示SIFT特征点提取结果
  
  waitKey(0);

  
  return 0;
}

CMakeLists.txt

和上面一样

执行结果:

./orb_cv1 1.png 

number of keypoints=4163
time of orb=0.0144924
***************************************
number of keypoints=1530
time of sift=0.0766446
***************************************
number of keypoints=1933
time of surf=0.0254675
***************************************
number of keypoints=1933
time of kaze =0.021055
***************************************

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值