【line features】线特征(2)

发布于:2024-10-11 ⋅ 阅读:(137) ⋅ 点赞:(0)

1. line features实现原理

这个程序实现了利用 OpenCV 和自定义的 Line Descriptor 模块(基于 cvm::line_descriptor)进行线特征检测、描述符计算和特征匹配的过程。下面是算法实现的流程总结:

1. 初始化与参数设置

  • 使用 glog 进行日志记录初始化,并将日志输出到标准输出 (FLAGS_logtostderr=true)。
  • 相机内参被定义,但未在后续使用中具体体现(可能是保留为进一步扩展使用)。

2. 图像读取

  • 从指定路径中读取两张 RGB 图像 color1color2
  • 若图像读取失败,程序会提示错误。

3. 线特征检测

  • 利用 LSDDetector 对两幅图像分别提取线特征:
    • 图像 1 提取到的线特征存储在 keylines1 中。
    • 图像 2 提取到的线特征存储在 keylines2 中。
  • 使用 LOG(INFO) 记录每幅图像中提取到的线特征数量。

4. 线特征描述子计算

  • 使用 BinaryDescriptor 对每幅图像提取到的线特征计算描述子,分别生成 ldesc1ldesc2
  • 对提取到的线段进行可视化,生成包含线段的图像并保存。

5. 特征匹配

  • 使用 BinaryDescriptorMatcher 进行两幅图像的线特征描述子匹配,匹配结果保存在 matches 中。
  • 记录匹配到的线特征对数量。

6. 匹配结果可视化

  • 利用 drawLineMatches 对匹配结果进行可视化,将匹配的线段绘制到输出图像 out_match_img 中,并将结果图像保存到指定路径。

7. 结束输出

  • 程序输出 “Hello, World!” 并结束。

关键流程总结:

  1. 读取图像 → 2. 提取线特征 → 3. 计算描述子 → 4. 进行特征匹配 → 5. 结果可视化和保存

2.line features实现流程

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
using std::string;

#include <glog/logging.h>

#include <opencv2/opencv.hpp>
#include "descriptor_opencvm.hpp"

#include <Eigen/Core>
#include <Eigen/Geometry>

int main(int argc, char** argv) {
    //读入图像
    google::InitGoogleLogging(argv[0]);
    google::InstallFailureSignalHandler();
    FLAGS_logtostderr=true;

    double fx=481.2;
    double fy=480;
    double cx=319.5;
    double cy=239.5;
    //读入图像
    cv::Mat color1 = cv::imread("/home/sun/demo/line_descriptor_opencvm_demo-main/0.png",-1);     //先读入一帧RGB和depth
    cv::Mat color2 = cv::imread("/home/sun/demo/line_descriptor_opencvm_demo-main/50.png",-1);
    if ( color1.data==nullptr || color2.empty()){
        cout<<"wrong input rgb image"<<endl;
    }
    //初始化
    cv::Ptr<cvm::line_descriptor::LSDDetector> lsd = cvm::line_descriptor::LSDDetector::createLSDDetector();
    cv::Ptr<cvm::line_descriptor::BinaryDescriptor> lbd = cvm::line_descriptor::BinaryDescriptor::createBinaryDescriptor();

    //提取图1的线特征
    std::vector<cvm::line_descriptor::KeyLine> keylines1;
    lsd->detect(color1, keylines1, 1.2, 1);  //提取线特征并计算描述子
    LOG(INFO)<<"Extract line1 num = "<<keylines1.size();
    cv::Mat ldesc1;
    lbd->compute(color1, keylines1, ldesc1);     //计算特征线段的描述子
    cv::Mat outlinesimg1;
    cvm::line_descriptor::drawKeylines(color1,keylines1,outlinesimg1);
    cv::imwrite("/home/sun/demo/line_descriptor_opencvm_demo-main/colorline1.png",outlinesimg1);

    //提取图2的线特征
    std::vector<cvm::line_descriptor::KeyLine> keylines2;
    lsd->detect(color2, keylines2, 1.2, 1);  //提取线特征并计算描述子
    LOG(INFO)<<"Extract line2 num = "<<keylines2.size();
    cv::Mat ldesc2;
    lbd->compute(color2, keylines2, ldesc2);     //计算特征线段的描述子
    cv::Mat outlinesimg2;
    cvm::line_descriptor::drawKeylines(color2,keylines2,outlinesimg2);
    cv::imwrite("/home/sun/demo/line_descriptor_opencvm_demo-main/colorline2.png",outlinesimg2);
    //匹配
    cv::Ptr<cvm::line_descriptor::BinaryDescriptorMatcher> bdm=cvm::line_descriptor::BinaryDescriptorMatcher::createBinaryDescriptorMatcher();
    std::vector<cv::DMatch> matches;
    bdm->match(ldesc1,ldesc2,matches);
    cv::Mat out_match_img;
    LOG(INFO)<<"match num = "<<matches.size();

    const std::vector<char> matchesMask(matches.size(),1);
    cvm::line_descriptor::drawLineMatches(color1,keylines1,color2,keylines2,matches,out_match_img,
            cv::Scalar::all(-1),cv::Scalar::all(-1),matchesMask,cvm::line_descriptor::DrawLinesMatchesFlags::DEFAULT);
    cv::imwrite("/home/sun/demo/line_descriptor_opencvm_demo-main/match_1_2.png",out_match_img);

    std::cout << "Hello, World!" << std::endl;
    return 0;
}

3.line features处理输入数据与输出结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到