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键即退出
相关文章:
RealSense深度相机在Ubuntu18.04的ros环境下,保存同一时刻下深度图像和彩色图像
背景:Ubuntu18.04 ROS Melodic 已安装配置好RealSense相关程序,链接D435i相机后,得到如下Rostopic: /camera/color/image_raw # 彩色图像信息 /camera/depth/image_rect_raw # 深度图像信息 于是写一个python程序&am…...
vue3 ref和reactive使用watch属性的方法和区别
在Vue 3中,您可以使用watch函数和watch选项来监视ref和reactive创建的响应式数据的变化。下面是它们的使用方法和区别: 使用方法: 使用ref和watch: import { ref, watch } from vue;const count ref(0);watch(count, (newVal,…...
YOLO目标检测——卫星遥感舰船检测数据集下载分享【含对应voc、coco和yolo三种格式标签】
实际项目应用:卫星遥感舰船检测数据集说明:卫星遥感舰船检测数据集,真实场景的高质量图片数据,数据场景丰富,含船一个类别标签说明:使用lableimg标注软件标注,标注框质量高,含voc(xm…...
org.Hs.eg.db使用--持续修改
org.Hs.eg.db使用–持续修改 加载 library(org.Hs.eg.db)1 基本信息查询 1.1 display the columns columns(org.Hs.eg.db) [1] "ACCNUM" "ALIAS" "ENSEMBL" "ENSEMBLPROT" "ENSEMBLTRANS" "ENT…...
C# Onnx 百度PaddleSeg发布的实时人像抠图PP-MattingV2
目录 效果 模型信息 项目 代码 下载 效果 图片源自网络侵删 模型信息 Inputs ------------------------- name:img tensor:Float[1, 3, 480, 640] --------------------------------------------------------------- Outputs -----------------…...
linux shell操作 - 04 进程间通信
文章目录 Signal 信号信号定义信号的生命周期信号分类linux进程通信案例 Signal 信号 信号定义 Linux信号是进程间通信的一种方式,通过向目标进程发送一个特定的信号,让其执行相应的处理操作; 向目标进程发送信号时,内核会将信号…...
【Java并发】聊聊线程池原理以及实际应用
线程其实对于操作系统来说是宝贵的资源,java层面的线程其实本质还是依赖于操作系统内核的线程进行处理任务,如果频繁的创建、使用、销毁线程,那么势必会非常浪费资源以及性能不高,所以池化技术(数据库连接池、线程池&a…...
自然语言处理常用方法和评价指标
常用方法 文本分类:如情感分析、主题标签分类。使用方法如朴素贝叶斯、支持向量机、神经网络等。信息提取:从文本中提取结构化信息,如命名实体识别(NER)、关系提取。语义分析:理解文本的含义,包…...
FFmpeg常用命令行讲解及实战一
文章目录 前言一、学习资料参考二、FFmpeg 选项1、主要选项①、主要命令选项②、举例 2、视频选项①、主要命令选项②、举例1)提取固定帧2)禁止输出视频3)指定视频的纵横比 3、音频选项①、主要命令选项②、举例 4、字幕选项①、主要命令选项…...
Java的ArrayList中关于删除的常用操作及方法
目录 remove(int index)方法 remove(Object o)方法 removeAll(Collection c)方法 removeIf(Predicate filter)方法 removeRange(int fromIndex, int toIndex)方法 remove(int index)方法 remove(int index)是ArrayList类中用于删除指定位置元素的方法。它接收一个整…...
低成本打造便携式无线网络攻防学习环境
1.摘要 一直以来, 无线网络安全问题与大众的个人隐私息息相关, 例如: 为了节省流量, 连接到一个看似安全的免费WiFi, 在使用过程中泄露自己的各类密码信息甚至银行卡账号密码信息。随着家用智能电器的普及, 家中的各类智能设备连入家里的无线网络, 却突然失灵, 甚至无法正常连…...
Qt|QLabel显示刷新图像数据
参考:QImage、QClipboard(https://zhuanlan.zhihu.com/p/649611141) 获取图像数据并转换为QImage unsigned char *data 图像数据; QImage show_image_ QImage(data, imgInfo.width, imgInfo.height, imgInfo.width, QImage::Format_Grays…...
Java类加载那些事
Java源文件(.java文件)被编译器编译后变为字节码形式的类文件(.class文件),Java类加载的过程就是JVM加载.class的二进制文件并且放到内存中,将数据放到方法区,并且在堆区构造一个java.lang.clas…...
QSplitter分裂器
QSplitter QSplitter 是 Qt 框架提供的一个小部件(widget),用于在用户界面中创建可拖动的分割窗口,允许用户调整子部件的大小和布局。它可以将父部件分割为多个可调整大小的子部件,使用户能够自定义界面的布局和大小。…...
pgsql 时区查看和修改
建议使用UTC时区,或者和linux、后端程序的时区保持一致,否则容易出现时间的差别。 pgsql的时间字段有一个带时区的timestamp with time zone,如果业务涉及多个时区,建议使用这个字段。 相关链接参考: linux时区设置和…...
el-table 表格表头、单元格、滚动条样式修改
.2023.11.21今天我学习了如何对el-table表格样式进行修改,如图: 运用的两个样式主要是 1.header-cell-class-name(设置表头) 2.class-name(设置行单元格) 代码如下: <el-table :data&quo…...
dockerDesktop使用方法
安装软件 装在C盘会容易满,可以装在D盘, "path\to\Docker Desktop Installer.exe" install -accept-license --installation-dirD:\Docker\Docker --wsl-default-data-rootD:\Docker\data并且在软件的设置的Docker Engine里添加阿里镜像源…...
[Ubuntu]RT810xE--网线已拔出--问题解决
0 环境 ubuntu 22.04.3 LTSDell Inspiron 15 5547windows/ubuntu 双系统 1 问题说明 Dell 笔记本安装的 Ubutun 系统,有线网络无法使用,一直显示 “网线已拔出”。 网上一查,才了解到主要原因:网卡驱动安装错误。系统默认安装…...
美国DDoS服务器:如何保护你的网站免遭攻击?
在当今数字化时代,互联网已经成为人们生活中不可或缺的一部分。随着互联网的普及和发展,网络安全问题也日益严重。其中,DDoS攻击是目前最常见和具有破坏性的网络攻击之一。那么,如何保护你的网站免遭DDoS攻击呢?下面将介绍…...
R语言数据缩放-1到1
目录 普通scale -1到1限定范围scale 普通scale R语言实战:scale()函数 - 知乎 (zhihu.com) scale(x, center TRUE, scale TRUE) 过程: 对每个变量(列)计算平均值(mean)和标准…...
设计模式(C++)-行为型模式-策略模式
设计模式(C)-行为型模式-策略模式 一、策略模式概述 策略模式:是一种行为型设计模式,它定义了一系列算法,将每一个算法封装起来,并且使他们可以相互替换。策略模式让算法的变化独立于使用算法的客户端,使得算法可以在不…...
别再只会用LDO了!5V转3.3V的19种电路方案,从成本1毛到高效Buck全解析
5V转3.3V电路设计终极指南:从基础原理到工程实践 在嵌入式系统和物联网设备的设计中,电源转换电路如同人体的血液循环系统,为各个功能模块提供稳定可靠的能量供给。5V转3.3V的电路设计看似简单,实则蕴含着丰富的技术细节和工程权衡…...
FigmaCN:3分钟极速汉化Figma界面,设计师必备中文插件终极指南
FigmaCN:3分钟极速汉化Figma界面,设计师必备中文插件终极指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而头疼吗?作为一…...
零基础极速上手教程:30分钟用AI建站工具做出第一个网站
如果你完全不懂技术,对HTML、CSS、服务器这些词一头雾水,但又急需一个拿得出手的网站,这篇教程就是为你准备的。我们将抛开复杂的理论,用一套通用、可复制的实操步骤,带你体验从零到一做出一个完整网站的全过程。无论你…...
2026年小程序商城哪个比较好用?
2026年小程序商城哪个比较好用?小程序商城好不好用,取决于企业需求与平台能力的匹配度。从行业数据来看,不同需求场景下"好用"的标准不同:纯电商交易型适合专用电商平台,商城会员营销一体化适合国内SaaS平台࿰…...
挖掘机柴油机多工况智能故障识别系统设计【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)基于CAN总线多源数据采集与分层工况判别模型&#…...
刷到无数农村帮扶暖心瞬间,藏着最朴素的善意与坚守
常年和互联网打交道,我总习惯在忙碌的间隙,刷一刷各大平台的农村帮扶视频。没有华丽的剪辑,没有刻意的炒作,那些扎根乡村的帮扶者、默默付出的普通人,总能轻易触动心底最柔软的地方,也让我在浮躁的行业里&a…...
一个非技术人员的低代码学习路径
作为一名市场部运营,我没有专业编程基础,日常工作和代码开发几乎不沾边。每天除了活动策划、数据统计、部门协作对接,经常会被各类零散审批、台账统计、信息汇总等琐碎工作消耗大量时间。 一直想找一种简单高效的方式,自己搭建轻量…...
macOS--brewhome安装镜像
很快!咱们给 Homebrew 换成中科大(USTC)或者阿里的镜像源,这就相当于把“出国路”换成“高速路”。第一步:一键换源(直接复制粘贴)别关终端,直接把下面这一串命令全部复制࿰…...
【实测避坑】英文论文降AI:5大工具红黑榜与底层精修逻辑
留学生降ai成了一个大难题,很多同学都在问怎么给英文降ai,外文导师对AI查得非常严,如果turnitin检测ai率太高就麻烦了。 我也试过网上一大堆免费降ai率工具,踩了一大堆坑,今天不说虚的,给大家分享一下我的…...
