使用“OpenCV函数”和“ORB-SLAM2源码中的ExtractORB()函数”提取ORB特征点

 

 

 

#include "ORB/global_defination/global_defination.h"  // 导入ORB的全局定义
#include "ORB/ORBFeature.hpp"  // 导入ORB特征相关的头文件

using namespace ORB;  // 使用ORB命名空间

int main(int argc, char** argv)
{
    google::InitGoogleLogging(argv[0]);  // 初始化Google日志系统,参数是程序名
    FLAGS_alsologtostderr = true;  // 将日志同时输出到标准错误输出

    std::string config_path = WORK_SPACE_PATH + "/config/camera_para.yaml";  // 相机参数配置文件的路径
    std::string image_path = WORK_SPACE_PATH + "/image/distorted.png";  // 图像文件的路径

    // 创建一个ORB特征的对象,使用智能指针管理其生命周期
    std::shared_ptr orb_feature_ptr = std::make_shared(image_path, config_path);

    std::vector vKeypoints;  // 用于存储提取出的关键点
    cv::Mat descriptor;  // 用于存储关键点对应的描述子

    // 提取ORB特征
    orb_feature_ptr->ExtractORB(vKeypoints, descriptor);

    // 读入图像文件
    cv::Mat image = cv::imread(image_path, cv::IMREAD_GRAYSCALE);

    // 将关键点的数量和描述子的数量输出到日志
    LOG(INFO) << "vKeypoints size " << vKeypoints.size();
    LOG(INFO) << "descriptor size " << descriptor.rows;

    cv::Mat outImage;
    // 在图像中绘制关键点
    cv::drawKeypoints(image, vKeypoints, outImage, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT);
    // 显示包含关键点的图像
    cv::imshow("这是ORB-SLAM2提取的特征点", outImage);

    // 提取ORB特征(这行代码可能是重复了,或者是预留的,下面没有给出输入参数)
    orb_feature_ptr->ExtractORB();

    // 等待用户输入
    cv::waitKey();

    return 0;
}

std::shared_ptr orb_feature_ptr =
 std::make_shared(image_path, config_path);

    ORBFeature(image_path, config_path):这部分代码调用了ORBFeature的构造函数,并且传入image_pathconfig_path这两个参数。也就是说,它创建了一个ORBFeature的对象。

        调用 ORBFeature 类的构造函数,这个构造函数接收两个参数:image_pathconfig_path。这个调用会创建一个 ORBFeature 对象。                   std::make_sharedstd::make_shared是一个模板函数,它的作用是创建一个对象并返回一个指向该对象的shared_ptr智能指针。在这个例子中,std::make_shared(image_path, config_path)就是创建了一个ORBFeature对象,并返回一个std::shared_ptr类型的智能指针,这个智能指针指向新创建的ORBFeature对象。

        所以,std::make_shared(image_path, config_path)就是创建了一个ORBFeature对象,并用一个std::shared_ptr智能指针来管理它。这样做的好处是,你不需要手动管理这个ORBFeature对象的内存,当这个ORBFeature对象不再被使用时,shared_ptr会自动释放这个对象的内存。

    std::make_shared 是一个模板函数,它用于创建一个 std::shared_ptr 实例。这个函数需要一个类型参数(在尖括号 < > 中指定),以及一个用于构造该类型对象的参数列表(在圆括号 ( ) 中指定)。

    std::make_shared 会创建一个新的对象,并返回一个 std::shared_ptr,该指针指向新创建的对象。例如,std::make_shared(42) 会创建一个新的 int 对象,其值为42,并返回一个指向该对象的 std::shared_ptr

         例子中,std::make_shared(image_path, config_path) 会创建一个新的 ORBFeature 对象,使用 image_pathconfig_path 作为构造函数的参数,并返回一个指向该对象的 std::shared_ptr

        最后,将这个智能指针赋值给orb_feature_ptr。以后你可以通过orb_feature_ptr来使用这个ORBFeature对象。

   

你可能感兴趣的:(数码相机,opencv,计算机视觉)