RealSense深度相机在Ubuntu18.04的ros环境下,保存同一时刻下深度图像和彩色图像

背景:Ubuntu18.04  ROS Melodic 已安装配置好RealSense相关程序,链接D435i相机后,得到如下Rostopic:

/camera/color/image_raw        # 彩色图像信息
/camera/depth/image_rect_raw    # 深度图像信息

于是写一个python程序:

import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import numpy as np
import cv2
import time
import os
from imageio import imsavedef depth2Gray(im_depth):"""将深度图转至三通道8位灰度图(h, w, 3)"""# 16位转8位x_max = np.max(im_depth)x_min = np.min(im_depth)if x_max == x_min:print('图像渲染出错 ...')raise EOFErrork = 255 / (x_max - x_min)b = 255 - k * x_maxret = (im_depth * k + b).astype(np.uint8)return retdef depth2RGB(im_depth):"""将深度图转至三通道8位彩色图先将值为0的点去除,然后转换为彩图,然后将值为0的点设为红色(h, w, 3)im_depth: 单位 mm或m"""im_depth = depth2Gray(im_depth)im_color = cv2.applyColorMap(im_depth, cv2.COLORMAP_JET)return im_colordef inpaint(img, missing_value=0):"""Inpaint missing values in depth image.:param missing_value: Value to fill in teh depth image."""img = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_DEFAULT)mask = (img == missing_value).astype(np.uint8)scale = np.abs(img).max()img = img.astype(np.float32) / scale  # Has to be float32, 64 not supported.img = cv2.inpaint(img, mask, 1, cv2.INPAINT_NS)# Back to original size and value range.img = img[1:-1, 1:-1]img = img * scalereturn img def color_callback(color_msg):global color_imagecolor_image = bridge.imgmsg_to_cv2(color_msg, desired_encoding="bgr8")def depth_callback(depth_msg):global depth_imagedepth_image = bridge.imgmsg_to_cv2(depth_msg, desired_encoding="passthrough")def run():rospy.init_node('realsense_capture_node')bridge = CvBridge()color_sub = rospy.Subscriber('/camera/color/image_raw', Image, color_callback)depth_sub = rospy.Subscriber('/camera/depth/image_rect_raw', Image, depth_callback)# 创建保存图像的文件夹save_path = os.path.join(os.getcwd(), "data", time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()))os.makedirs(save_path)# 创建实时图像显示窗口cv2.namedWindow("live", cv2.WINDOW_AUTOSIZE)# cv2.namedWindow("save", cv2.WINDOW_AUTOSIZE)saved_count = 0try:while not rospy.is_shutdown():# 在回调函数中接收图像数据,这样我们就可以在主循环中使用它们if color_image is not None and depth_image is not None:color_image_copy = color_image.copy()depth_image_copy = depth_image.copy()# 可视化深度图像depth_image_copy = inpaint(depth_image_copy)depth_image_color = depth2RGB(depth_image_copy)# 调整彩色图像的大小以匹配深度图像的分辨率color_image_copy_resized = cv2.resize(color_image_copy, (depth_image_color.shape[1], depth_image_color.shape[0]))cv2.imshow("live", np.hstack((color_image_copy_resized, depth_image_color)))key = cv2.waitKey(30)# 按 's' 键保存图像if key & 0xFF == ord('s'):# 调整彩色图像的大小以匹配深度图像的分辨率color_image_copy_resized = cv2.resize(color_image_copy, (depth_image_copy.shape[1], depth_image_copy.shape[0]))cv2.imwrite(os.path.join(save_path, "{:04d}r.png".format(saved_count)), color_image_copy_resized)imsave(os.path.join(save_path, "{:04d}d.tiff".format(saved_count)), depth_image_copy)saved_count += 1cv2.imshow("live", np.hstack((color_image_copy_resized, depth_image_color)))# 原本是save# 按 'q' 键或按下 Esc 键退出程序if key & 0xFF == ord('q') or key == 27:cv2.destroyAllWindows()breakexcept rospy.ROSInterruptException:passif __name__ == '__main__':color_image = Nonedepth_image = Nonebridge = CvBridge()run()

运行程序后,会出现一个窗口,里面有两个画面,按下s键就会保存一套照片,按下q键即退出

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

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

相关文章

内网横向技术

如果拿下了一台机器之后寻找域控机器 ipconfig /all 找到域名 ping 域名或者nslookup域名

【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义

物理执行计划基本操作符 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏…

广州华锐互动:AR可视化展示昆虫让教学过程更直观生动

随着科技的不断发展,AR(增强现实)技术已经逐渐走进我们的生活。通过AR技术,我们可以将虚拟的信息叠加到现实世界中,让现实世界变得更加丰富多彩。在这篇文章中,我们将以昆虫为主题,探讨AR增强现…

ubuntu20.04下安装标注工具CVAT

1 安装docker sudo apt-get update sudo apt-get --no-install-recommends install -y apt-transport-https ca-certificates \curl \gnupg-agent \software-properties-commoncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-r…

ArgoCD基本组件

ArgoCD有5个基本组件, $ kubectl get po -n argocd NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 19h argocd-dex-server-767fb49f59-7rxn7 1/1 Running 0…

解密C语言指针中的解引用操作:深入理解 * 运算符

导言: C语言中的指针是一项复杂而强大的特性,而其中的解引用操作则是使得程序员能够直接访问内存中数据的关键。本篇博客将深入研究解引用操作,通过 * 运算符的应用,探讨如何巧妙地操作指针,从而实现对内存中数据的精准…

002、ArkTS

之——开发语言 杂谈 基础编程语言ArkTS。引用来自华为开发者课堂。 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让开发者以更简洁…

tp8 使用rabbitMQ(4)路由模式

路由模式 在第三节中我们使用的 交换机的 fanout 把生产者的消息广播到了所有与它绑定的队列中处理,但是我们能不能把特定的消息,发送给指定的队列,而不是广播给所有队列呢? 如图,交换机把 orange 类型的消息发送给了…

zookeeper 单机伪集群搭建简单记录

1、官方下载加压后,根目录下新建data和log目录,然后分别拷贝两份,分别放到D盘,E盘,F盘 2、data目录下面新建myid文件,文件内容分别为1,2,3.注意文件没有后缀,不能是txt文…

Java中类的类型判断技巧以及没有无参构造函数时的应对策略。isInstance()方法解析

类的类型判断 基本数据类型的包装类中&#xff0c;例如Integer、Long这些类是没有无参构造方法的&#xff0c;因此在以下情况中&#xff0c;会出错 具体类型是未知的&#xff0c;只有全路径类名 String typeSte "java.lang.Integer"; Class<?> typeClass …

LED驱动控制专用电路

一、基本概述 TM1628是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU 数 字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。 主要适用于家电设备(智能热水器、微波炉、洗衣机、空调…

排序算法-----基数排序

目录 前言 基数排序 算法思想 ​编辑 算法示例 代码实现 1.队列queue.h 头文件 2.队列queue.c 源文件 3.主函数&#xff08;radix_sort实现&#xff09; 算法分析 前言 今天我想把前面未更新完的排序算法补充一下&#xff0c;也就是基数排序的一种&#xff0c;这是跟…

Android 一键屏锁的实现

1.activity里的代码 获取设备管理器 Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.main);registerReceiver();devicePolicyManager (DevicePolicyManager)getSystemService(DEVICE_POLICY_SER…

ubuntu 使用webrtc_ros 编译linux webrtc库

ubuntu 使用webrtc_ros 编译linux webrtc库 webrtc_ros 使用WebRTC流式传输ROS图像主题 该节点提供了一个WebRTC对等方&#xff0c;可以将其配置为流ROS图像主题并接收发布到ROS图像主题的流。 该节点托管一个提供简单测试页面的Web服务器&#xff0c;并提供可用于创建和配置W…

基于Vue+SpringBoot的APK检测管理系统

项目编号&#xff1a; S 038 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S038&#xff0c;文末获取源码。} 项目编号&#xff1a;S038&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软…

电子学会C/C++编程等级考试2021年09月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符统计 给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。输入 输入包含一行,一个字符串,长度不超过1000。输出 输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多…

Python入门03变量

目录 1 什么是变量2 变量声明3 变量命名规则4 变量类型5 类型转换总结 1 什么是变量 编程语言中变量就像容器一样&#xff0c;可以用来存放东西 我的变量就像杯子一样&#xff0c;可以用来盛放各种饮料。在Python中变量用来存放各种各样的数据&#xff0c;比如整数、浮点数、…

【计算机网络】HTTP 协议

文章目录 前言什么是 HTTP理解 HTTP 请求和响应格式HTTP 的请求格式1. 首行2. 请求头3. 空行4. 正文&#xff08;body&#xff09; HTTP 的响应格式1. 首行2. 响应头3. 空行4. 正文&#xff08;body&#xff09; 首行GET 和 POST 方法有什么区别针对 GET 方法和 POST 方法的区别…

ubuntu挂载硬盘方法

1.关闭服务器加上新硬盘 2.启动服务器&#xff0c;以root用户登录 3.查看硬盘信息 fdisk -l4.格式化分区 找到需要分区的目录,并记录分区的uuid&#xff0c;用于后面修改/etc/fstab永久挂载配置文件 mkfs.ext4 /dev/nvme0n1 mkfs.ext4 /dev/nvme1n1 Filesystem UUID: a1c…

【C++】构造函数和析构函数第四部分(深拷贝和浅拷贝)--- 2023.11.25

目录 什么是浅拷贝&#xff1f;浅拷贝的问题使用深拷贝解决浅拷贝问题结束语 什么是浅拷贝&#xff1f; 如果在一个类中没有人为定义拷贝函数&#xff0c;则系统会提供默认拷贝函数。那么在此默认拷贝函数中主要进行了简单的赋值操作&#xff0c;那这个简单的赋值操作我们一般…