fast角点与ShiTomas角点速度对比

FAST角点的主要优势就是速度快,比SIFT快了几乎一个数量级,从而可以满足SLAM实时性的要求。
Shi-Tomas角点是vins-mono中使用的角点。
下面我对这两种角点在检测上的速度和能够检测到的最大角点数量进行了对比。
使用两种角点对KITTI数据集中的28帧图片进行检测,检测结果如下:
下图显示了ShiTomas角点检测到的角点数量及其花费的时间

上图为ShiTomas角点检测到的角点数量及其花费的时间
下图显示了FAST角点检测到的角点数量及其花费的时间

在这里插入图片描述
可以看出,提取相同的28帧图片,FAST角点检测方法提取到了更多的角点,且花费的时间要小于ShiTomas。
FAST的快果然名不虚传。

下面附上这两种提取算法的代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <chrono>
using namespace std;
using namespace cv;

int main(int argc , char* argv[])
{
    int thread_value = 30;
    vector<String> files;     //存放文件路径
    vector<Mat> images;       //存放文件数据

    //读取文件夹下所有符合要求的文件路径
    glob("/home/wang/code/jiaodian/testingpicture/*.png", files, true);
    size_t num = files.size();  //读取的符合条件的文件个数

    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    for (int i = 0; i < num; i++)
    {
        //Mat after_fast_image;
        Mat img = imread(files[i], IMREAD_GRAYSCALE);     //读取灰度图像
        if (img.empty())
        {
            cerr << files[i] << " can't be loaded!" << endl;
            continue;
        }
        //images.push_back(img);  //将图像数据存入images中
        std::vector<cv::KeyPoint> keypoints;
        //chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
        cv::FAST(img, keypoints,thread_value);
        //chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
        //chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
        //cout<<"fast 角点  solve time cost = "<<time_used.count()<<" seconds. "<<endl;
        cout << "fast picture " << i << "角点 数目 " << keypoints.size() << endl;

        //cv::drawKeypoints(img, keypoints, after_fast_image, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT);
        //cv::imshow("after_fast_corner", after_fast_image);
    }

    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
    cout<<"fast 角点  solve time total cost = "<<time_used.count()<<" seconds. "<<endl;

    //waitKey();
    return 0;
}

接下来是ShiTomas的检测代码

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <chrono>
using namespace cv;
using namespace std;

//描述:定义一些辅助宏
#define WINDOW_NAME "【Shi-Tomasi角点检测】" 
int main(int acgc , char* acgv[])
{
    vector<String> files;     //存放文件路径
    vector<Mat> images;       //存放文件数据

    //读取文件夹下所有符合要求的文件路径
    glob("/home/wang/code/jiaodian/testingpicture/*.png", files, true);
    size_t num = files.size();  //读取的符合条件的文件个数

    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    for (int i = 0; i < num; i++)
    {
        //Mat after_fast_image;
        Mat img = imread(files[i], IMREAD_GRAYSCALE);     //读取灰度图像

        //shi-tomasi算法
        vector<Point2f> corner;
        double qualityLevel = 0.01;     //角点检测可接收的最小特征
        //double minDistance =10;        //角点之间的最小的距离
        double minDistance =5;
        int blockSize = 3;              //计算导数自相关矩阵时指定的邻域范围
        double k = 0.04;                //权重系数
        //Mat copy = g_srcImage.clone();

        if (img.empty())
        {
            cerr << files[i] << " can't be loaded!" << endl;
            continue;
        }
        //images.push_back(img);  //将图像数据存入images中
        //chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
        goodFeaturesToTrack(img, corner, 4000, qualityLevel, minDistance, Mat(), blockSize, false, k);
        //chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
        //chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
        //cout<<"ShiTomas 角点  solve time cost = "<<time_used.count()<<" seconds. "<<endl;
        cout << "ShiTomas picture " << i << " 角点 数目 " << corner.size() << endl;

        //cv::drawKeypoints(img, corner, after_fast_image, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT);
        //cv::imshow("after_fast_corner", after_fast_image);
    }

    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
    cout<<"ShiTomas 角点  solve time cost = "<<time_used.count()<<" seconds. "<<endl;

    return 0;
}
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

触不可及<>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值