转载于:
在原作者的基础上添加了详细的注释
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
***************************************