【line features】线特征(2)

news2024/11/6 3:12:17

【line features】线特征(2)

    • 1. line features实现原理
      • 1. **初始化与参数设置**:
      • 2. **图像读取**:
      • 3. **线特征检测**:
      • 4. **线特征描述子计算**:
      • 5. **特征匹配**:
      • 6. **匹配结果可视化**:
      • 7. **结束输出**:
      • 关键流程总结:
    • 2.line features实现流程
    • 3.line features处理输入数据与输出结果

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处理输入数据与输出结果

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

递归算法介绍和【题解】——数楼梯

递归算法介绍和【题解】——数楼梯 1.递推算法介绍2.数楼梯题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 1.思路解析2.AC代码 1.递推算法介绍 有些目标是宏大的&#xff0c;比如如果你想找到一个好工作&#xff0c;需要先把面试通过。要把面试通过&#xff0c;就需…

c++11~c++20 结构化绑定

结构化帮绑定可以作用于3中类型 一、原生数组类型 结果&#xff1a; 备注&#xff1a;绑定到原生数组所需条件仅仅是要求别名的数量于数组元素的个数一致&#xff0c;这里的x&#xff0c;y&#xff0c;z分别绑定到a[0],a[1],a[2] 二、绑定到结构体和类对象 结果&#xff1a;…

C99中的变长数组

在C99标准之前&#xff0c;从语言在创建数组的时候&#xff0c;指定数组的大小只能使用常量和表达式&#xff0c;或者数据初始化的时候&#xff0c;可以省略数组大小。 1.int arr[5]{1,2,3,4,4}; 2.int arr[24]{1,2,3,4,5,6}; 3.int arr[]{1,2,3,3,4,5,6}; 这样的语法限制不够灵…

新疆阿克苏地区新和县召开2024年重大项目高质量发展推进会

五一水库及生态修复产业融合发展等14个项目动工兴建 9月29日&#xff0c;新疆阿克苏地区新和县举行2024年重大项目高质量发展推进会上&#xff0c;五一水库生态修复暨产业融合发展重点项目等14个项目正式动工兴建。 据了解&#xff0c;此次开工的14个项目&#xff0c;总投资17…

LPDDR4芯片学习(二)——Functional Description

一、LPDDR4寻址表 以每个die容量为4GB为例&#xff1a; Memory density(per channel) 2Gb&#xff1a;每个通道大小为2Gb&#xff0c;一个die有两个通道Configuration 16Mb 16DQ 8 banks 2 channels &#xff1a;16Mb的寻址空间16位每个channels8个bank*每个die两channels。1…

电影《749局》酷燃首映 苗苗神秘感大片释出氛围感拉满

2024 年 9 月 30 日&#xff0c;电影《749 局》在北京举办首映礼&#xff0c;导演陆川携主创王俊凯、苗苗、郑恺、任敏、李晨、杨皓宇出席&#xff0c;演员苗苗在片中饰演 749 局成员夏婳&#xff0c;这个角色天赋异禀&#xff0c;拥有特殊异能&#xff0c;为影片增添一抹神秘色…

从异步传染浅谈代数效应

如果你经常使用并且关注React&#xff0c;你一定会在不少地方见过"代数效应"&#xff08;algebra effect) 这个抽象概念。可能是翻译和过度学术的缘故&#xff0c;我看了很多文章才大致理解&#xff0c;在这里简单记录一下。 try/catch & try/handle 你一定使用…

通信工程学习:什么是CSMA/CD载波监听多路访问/冲突检测

CSMA/CD&#xff1a;载波监听多路访问/冲突检测 CSMA/CD&#xff08;Carrier Sense Multiple Access/Collision Detect&#xff09;&#xff0c;即载波监听多路访问/冲突检测&#xff0c;是一种用于数据通信的介质访问控制协议&#xff0c;广泛应用于局域网&#xff08;特别是以…

SQL增删查改操作

目录 数据库概述 SQL基础操作 SQL通用语法 数据类型 SQL语句的分类 DDL(数据库定义,表定义,字段定义) 数据库操作 表操作 DDL小结 DML(数据的增删改,数据操作语言) DQL(查询) DQL小节 数据库概述 数据库,顾名思义就是用来存储和管理数据的,我们平时所使用的各大软…

养老院管理系统(含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 养老院管理系统拥有两种角色&#xff1a;管理员和护工 管理员&#xff1a;用户管理、老人信息管理、事故记录管理、入住费用管理、护工薪资管理、护工请假管理、床位管理、请假管理等 护…

消息中间件:RabbitMQ

消息中间件&#xff1a;RabbitMQ 前言安装Window安装Linux安装 管理页面什么是RabbitMQ&#xff1f;入门基本概念简单队列工作队列&#xff08;Work Queues&#xff09;发布/订阅&#xff08;Publish/Subscribe&#xff09;临时队列 路由&#xff08;Routing&#xff09;主题&a…

NanoDet安装教程

目录 1.安装NanoDet 1.1官网下载NanoDet 1.2 创建虚拟conda环境 1.3安装Pytorch库 2.侦测 3.训练 3.1yml文件修改 3.训练 3.1yml文件修改 轻量级模型 NanoDet-m 目标检测框架&#xff1a; YOLO 、 SSD 、 Fast R-CNN 等模型 &#xff1b;但模型太大&#xff0c;不适合移植到移…

HTTP状态码全解

文章目录 常见状态码1XX Informational&#xff08;请求正在处理&#xff09;2XX Success&#xff08;请求成功&#xff09;3XX Redirection&#xff08;重定向&#xff09;4XX Client Error&#xff08;客户端错误&#xff09;5XX Server Error&#xff08;服务器错误&#xf…

ros2安装完成后重要的一步

安装完成ros2之后&#xff0c;每次打开新的终端都需要 source /opt/ros/humble/setup.bash 为了解决这个为题&#xff0c;我们需要做如下操作,避免每次打开一个新的在终端都要设置。 在文件的最后一行添加 source /opt/ros/foxy/setup.bash

浸没式密封连接器

在当今科技快速发展的背景下&#xff0c;电子设备的整合度与性能需求持续提高&#xff0c;而连接技术作为电子设备间交互的关键&#xff0c;其重要性显而易见。在各式各样的连接技术当中&#xff0c;浸没式密封连接器凭借其独到设计和高超性能&#xff0c;在特定使用环境中显示…

学习经验分享【38】YOLOv11解读——最新YOLO版本

YOLO算法更新速度很快&#xff0c;已经出到V11版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。后续将改进YOLOv11算法&#xff0c;有需要的朋友可关注&#xff0c;我会持续进行更新。 YOLO11是Ultralytics YOLO系列实时目标检测器的最新迭代版本&#x…

《Linux从小白到高手》理论篇(七):Linux的时间管理运行级别启动过程原理详解

List item 本篇将介绍Linux的时间管理&运行级别相关知识&#xff0c;并将深入介绍Linux的启动过程及原理。 Linux的时间管理 Linux 时钟分为系统时钟&#xff08;System Clock&#xff09;和硬件&#xff08;Real Time Clock&#xff0c;简称 RTC&#xff09;时钟。系统时…

STM32CubeMX创建STM32H743工程

1、下载安装STM32CubeMX STM32CubeMX是STM32Cube工具家族中的一员&#xff0c;从MCU/MPU选型&#xff0c;引脚配置&#xff0c;系统时钟以及外设时钟设置&#xff0c;到外设参数配置&#xff0c;中间件参数配置&#xff0c;它给STM32开发者们提供了一种简单&#xff0c;方便&a…

华为OD机试 - 积木最远距离(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

[Everything] 文件搜索工具的下载及详细安装使用过程(附有下载文件)

快速搜索文件名及其所在路径 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压后得到文件 双击exe文件得到 选择简体中文&#xff0c;点击OK 点击“我接受” 更改安装目录&#xff0c;最好不要放在C盘&#xff0c;点击下一步 点击下一步 点…