将ros的深度图像 转换成 opencv的图像 并求距离

2023-05-16

将ros的图像 转换成 opencv的图像并求距离

      • 参考的博客
      • 概念
      • 将ROS图像消息转换为OpenCV图像
      • 示例
      • 计算距离

参考的博客

ROS学习笔记47(ROS图像和OpenCV图像之间的转换(C ++))
如何使用ROS的service读取Kinect图像
使用kinect2进行目标跟踪-ROS平台
深度图从ros数据类型转换成了opencv数据类型

概念

ROS以自己的sensor_msgs / Image消息格式传递图像,但许多用户希望将图像与OpenCV结合使用。

CvBridge是一个ROS库,提供ROS和OpenCV之间的接口。

CvBridge可以在cv_bridge包在vision_opencv stack找到。

使用CvBridge将ROS图像转换为OpenCV cv :: Mat格式的节点。
将OpenCV图像转换为ROS格式,并以通过ROS发布。
在这里插入图片描述

将ROS图像消息转换为OpenCV图像

CvBridge定义了一个包含OpenCV图像的CvImage类型,its encoding and a ROS header。CvImage也包含sensor_msgs / Image的信息,因此我们可以将一个转换为另一个。


namespace cv_bridge {
 
class CvImage
{
public:
  std_msgs::Header header;
  std::string encoding;
  cv::Mat image;
};
 
typedef boost::shared_ptr<CvImage> CvImagePtr;
typedef boost::shared_ptr<CvImage const> CvImageConstPtr;
 
}

将ROS sensor_msgs / Image消息转换为CvImage时,CvBridge会识别两个不同的用例:

  1. 我们想要就地修改数据。我们必须复制ROS消息数据。
  2. 我们不会修改数据。我们可以安全地共享ROS消息所拥有的数据,而不是复制。

CvBridge提供以下用于转换为CvImage的函数

// Case 1: Always copy, returning a mutable CvImage
CvImagePtr toCvCopy(const sensor_msgs::ImageConstPtr& source,
                    const std::string& encoding = std::string());
CvImagePtr toCvCopy(const sensor_msgs::Image& source,
                    const std::string& encoding = std::string());
 
// Case 2: Share if possible, returning a const CvImage
CvImageConstPtr toCvShare(const sensor_msgs::ImageConstPtr& source,
                          const std::string& encoding = std::string());
CvImageConstPtr toCvShare(const sensor_msgs::Image& source,
                          const boost::shared_ptr<void const>& tracked_object,
                          const std::string& encoding = std::string());

输入是图像消息指针,以及可选的编码参数。编码 refers to目标CvImage。

即使源和目标编码匹配,toCvCopy也会从ROS消息创建图像数据的副本。不过,您可以自由修改返回的CvImage。

如果源和目标编码匹配,toCvShare将在ROS消息数据上指向返回的CV::Mat,避免复制。只要您还拥有返回的CvImage的副本,就不会释放ROS消息数据。

如果编码不匹配,它将分配一个新缓冲区并执行转换。您不能修改返回的CvImage,因为它可能与ROS图像消息共享数据,而ROS图像消息又可能与其他回调共享。

注意:如果您指向包含要转换的sensor_msgs / Image的其他消息类型(例如stereo_msgs / DisparityImage),则toCvShare的第二个重载函数会更方便。

如果没有给出编码(或者更确切地说是空字符串),则目标图像编码将与图像消息编码相同。在这种情况下,toCvShare保证不复制图像数据。图像编码可以是以下OpenCV图像编码中的任何一种:

  • 8UC[1-4]
  • 8SC[1-4]
  • 16UC[1-4]
  • 16SC[1-4]
  • 32SC[1-4]
  • 32FC[1-4]
  • 64FC[1-4]

对于流行的图像编码,CvBridge可根据需要选择进行颜色或像素深度转换。要使用此功能,请将编码指定为以下字符串之一:

mono8:CV_8UC1,灰度图像

mono16:CV_16UC1,16位灰度图像

bgr8:CV_8UC3,彩色图像,蓝绿红色顺序

rgb8:CV_8UC3,带有红绿蓝颜色顺序的彩色图像

bgra8:CV_8UC4,带有alpha通道的BGR彩色图像

rgba8:CV_8UC4,带有alpha通道的RGB彩色图像

请注意,mono8和bgr8是大多数OpenCV函数所期望的两种图像编码。

最后,CvBridge会将Bayer pattern encodings识别为具有OpenCV类型8UC1(8位无符号,一个通道)。它不会与Bayer pattern进行转换; 在典型的ROS系统中,这是由image_proc完成的。CvBridge认可以下Bayer pattern:

bayer_rggb8

bayer_bggr8

bayer_gbrg8

bayer_grbg8

示例

这是一个侦听ROS图像消息主题的节点,将图像转换为cv :: Mat。然后通过ROS重新发布图像。

在package.xml和CMakeLists.xml中(或使用catkin_create_pkg时),添加以下依赖项:

sensor_msgs
cv_bridge
roscpp
std_msgs
image_transport

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
cv上障碍物的颜色特别白,分不清前后

TYPE_32FC1 这个编码格式 只有这个能正确显示

TYPE_8UC1 就全黑了

TYPE_16UC1 就全黑了

经过验证,ros的编码方式就是32FC1
在这里插入图片描述
再把cv的图像转换回去 还是 可以区分前后的

目前还没有确定 深度图像返回的是不是距离 应该是 ,但是数据是真对不上

depth_msg->encoding.c_str() 来确定数据类型
printf("%s",str) 打印字符串

  depth_pic = depth_ptr->image;

  // output some info about the depth image in cv format
  cout<<"output some info about the depth image in cv format"<<endl;
  cout<<"rows of the depth image = "<<depth_pic.rows<<endl; 
  cout<<"cols of the depth image = "<<depth_pic.cols<<endl; 
  cout<<"type of depth_pic's element = "<<depth_pic.type()<<endl;    5代表CV_32FC1 

结果
在这里插入图片描述

计算距离

深度图的像素值代表距离吗? 可以计算距离,但像素并不是距离
从这篇博客看不是的
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将ros的深度图像 转换成 opencv的图像 并求距离 的相关文章

随机推荐

  • 请回答:Git是什么?

    Git 是什么 xff1f 不卖关子 xff0c 直接说重点 xff0c 以下是 Git 官网上的描述 xff1a Git is a free and open source distributed version control syst
  • Git三大特色之Stage(暂存区)

    这是开篇 有人说 xff0c 暂存区是 Git 最精彩的设计 xff0c 同时也是最难理解的部分 xff0c 两者我都感觉不太明显 xff0c 但当我想写关于暂存区的理解后 xff0c 发现的确不怎么好讲 xff0c 这个玩意 xff0c
  • JSON解析异常-org.json.JSONException: Expected a ‘:‘ after a key

    问题场景 后端开发好接口 xff0c 给发过来接口文档 xff0c 于是开始开心的使用 GsonFormat 插件 建实体了 xff0c 然而转换 JSON 时出错 错误现场截图 xff1a 问题分析 JSON 转换失败一般有以下两个原因
  • Gradle-Could not determine java version from ‘11‘

    问题描述 因为换工作 xff0c 需要新配置的环境 xff0c 所以遇到了各种问题 xff0c 例如下面这个 xff1a 发生错误的相关环境配置 JDK 11Gradle 4 4 如果不知道自己安装的 Java 版本 xff0c 可以根据一
  • 重装双系统中的 Ubuntu

    我的电脑是 Windows 43 Ubuntu 双系统 xff08 UEFI启动 xff09 xff0c 最近 Ubuntu 被我玩坏了 xff0c 正好 15 04 alpha 2 发布了嘛 xff0c 我就想干脆重装 Ubuntu 算了
  • Markdown:插入图片和图注

    文章目录 在Markdown中插入图片 xff0c 调节位置 xff0c 大小 xff0c 以及插入图注 并排插入图片并排插入图片但无缝隙简单的插入可调整大小图片使用图床 xff08 腾讯云cos 43 picgo xff09 在markd
  • Vmware Esxi在线管理虚拟机

    目录 特征 占地面积小 可靠的性能 增强的安全性 生态系统卓越 用户友好的体验 管理截图 登录系统 主机虚拟机 虚拟机操作 What is ESXI Bare Metal Hypervisor ESX VMware 特征 通过将多台服务器整
  • 孤立森林(Isolation Forest)

    最近正好在做孤立森林的项目 xff0c 写下这篇推文记录下项目进程 xff0c 也给需要做这个项目的同学一点参考 1 什么叫异常点 图中红色的点偏离大部分的数据 xff0c 可以发现这些点分布稀疏且离密度高的群体较远 xff0c 这样的点称
  • 修改docker容器端口映射

    大家都知道docker run可以指定端口映射 xff0c 但是容器一旦生成 xff0c 就没有一个命令可以直接修改 通常间接的办法是 xff0c 保存镜像 xff0c 再创建一个新的容器 xff0c 在创建时指定新的端口映射 有没有办法不
  • MaxWelll常用命令

    文章目录 1 启动maxwell xff1a 1 1 控制台为输出 xff1a 1 2 kafka为输出 xff1a 1 3 配置指定某些表输出 xff1a 1 4 配置输出到kafka 分区规则为表的主键 xff1a 1 5 配置文件启动
  • Linux系统--进程与线程的区别

    看了一遍排在前面的答案 xff0c 类似 进程是资源分配的最小单位 xff0c 线程是CPU调度的最小单位 这样的回答感觉太抽象 xff0c 都不太容易让人理解 做个简单的比喻 xff1a 进程 61 火车 xff0c 线程 61 车厢 线
  • 关于锁的理解

    本文打算写一些和锁有关的东西 xff0c 谈一谈我对锁的原理和实现的理解 xff0c 主要包含以下方面 信号量互斥量条件变量 同步与互斥 其实同步与互斥都是计算机科学里面概念性的东西 xff0c 它们和什么编程语言 操作系统其实都没什么关系
  • Android 适配ipv6

    Android8 0开始支持ipv6 okhttp支持ipv6 glide支持ipv6方法 ijkplayer
  • java自我学习第一阶段的收获和感受

    1 首先对于编程的学习第一步都是基本语法的学习 xff0c 语法学习的特点有 xff1a 所有编程语言的语法定义都大体相似 xff0c 大概的是编程发展的延续 xff0c 没有人语言设计人员会标新立异 xff0c 只有站在别人的肩上不断完善
  • docker常用命令及配置

    最近使用了docker xff0c 像是发现了新大陆 真是简洁好用的东西 xff0c 为啥原来没发现 docker的安装不再赘述 xff0c 在此记录一下常用的命令 xff0c 以便于将来查询 查看docker容器版本 docker ver
  • 数字图像处理读后感

    数字图像处理读后感 前言 初步写完比赛代码后 看了机器学习看了数字图像处理还有其他的一些乱七八糟的东西 然后又觉得如果只是看完没有总结回顾那就是很失败的一件事情 所以就想写一写自己的读后感 我自己看得是B站的视频 这是西安电子科技大学的任老
  • 第七天 树莓派+计算棒配置过程

    一 xff1a 安装过程参考 xff1a https blog csdn net qqqzmy article details 85213414 1 材料硬件 树莓派3B 43 intel movidius 神经元计算棒2代显示器 鼠标键盘
  • Docker镜像推送(push)到Docker Hub

    镜像构建成功后 xff0c 只要有docker环境就可以使用 xff0c 但必须将镜像推送到Docker Hub上去 我们之前创建的镜像不符合Docker Hub的tag要求 xff0c 因为 在Docker Hub注册的用户名是boony
  • Altera FPGA 远程更新

    文章目录 1 概述2 如何生成factory jic xff1f 3 如何使用ASMI IP4 如何使用Remote updata IP xff1f 5 UART命令 以下内容均参考自官方手册 手册下载地址 xff1a ug altremo
  • 将ros的深度图像 转换成 opencv的图像 并求距离

    将ros的图像 转换成 opencv的图像并求距离 参考的博客概念将ROS图像消息转换为OpenCV图像示例计算距离 参考的博客 ROS学习笔记47 xff08 ROS图像和OpenCV图像之间的转换 xff08 C 43 43 xff09