文章目录
最近看大佬的书,《机器人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。