当前位置: 首页 > news >正文

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表格样式进行修改&#xff0c;如图&#xff1a; 运用的两个样式主要是 1.header-cell-class-name&#xff08;设置表头&#xff09; 2.class-name&#xff08;设置行单元格&#xff09; 代码如下&#xff1a; <el-table :data&quo…...

dockerDesktop使用方法

安装软件 装在C盘会容易满&#xff0c;可以装在D盘&#xff0c; "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 系统&#xff0c;有线网络无法使用&#xff0c;一直显示 “网线已拔出”。 网上一查&#xff0c;才了解到主要原因&#xff1a;网卡驱动安装错误。系统默认安装…...

美国DDoS服务器:如何保护你的网站免遭攻击?

​  在当今数字化时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。随着互联网的普及和发展&#xff0c;网络安全问题也日益严重。其中&#xff0c;DDoS攻击是目前最常见和具有破坏性的网络攻击之一。那么&#xff0c;如何保护你的网站免遭DDoS攻击呢?下面将介绍…...

R语言数据缩放-1到1

目录 普通scale -1到1限定范围scale 普通scale R语言实战&#xff1a;scale&#xff08;&#xff09;函数 - 知乎 (zhihu.com) scale(x, center TRUE, scale TRUE) 过程&#xff1a; 对每个变量&#xff08;列&#xff09;计算平均值&#xff08;mean&#xff09;和标准…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...