使用ros从realsence相机中获取图像

news2024/9/22 6:40:55

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、使用ros从realsence相机中获取录制的视频并播放
    • 1.开启ros内核
    • 2.打开realsense相机
    • 3.查看当前话题
    • 4.在相机界面显示RGB图像和depth图像
      • 4.1 添加Image
      • 4.2 填入RGB话题
      • 4.3 填入depth话题
    • 5.录制视频
    • 6.播放录制的视频
  • 二. 另一种显示话题的方式
  • 三. 将视频拆分成每帧,并分开存储RGB和Depth图像
  • 总结


前言

使用ros从相机中获取视频,并将视频拆分成每帧图像,将RGB图像和Depth图像分别保存在两个文件夹中。


一、使用ros从realsence相机中获取录制的视频并播放

1.开启ros内核

代码如下(示例):

roscore

演示如下:
请添加图片描述

2.打开realsense相机

代码如下(示例):

roslaunch realsense2_camera demo_pointcloud.launch

演示如下:
请添加图片描述
打开界面如下图:

请添加图片描述

3.查看当前话题

代码如下(示例):

rostopic list

演示如下:
请添加图片描述
说明:
“/camera/color/image_raw” 是RGB图像的话题;
“/camera/depth/image_rect_raw” 是depth图像的话题。

4.在相机界面显示RGB图像和depth图像

4.1 添加Image

点击左下角的“ADD”,出现中间的界面;选择“Image“;点击”OK“。
请添加图片描述

4.2 填入RGB话题

展开左边的“Image",在“Image Topic"填入RGB图像的话题,即可在左下角成功显示出RGB图像。
请添加图片描述

4.3 填入depth话题

继续按照4.1进行添加,再按照4.2在“Image Topic”中填入depth图像的话题,即可在左下角也显示出深度图的图像。请添加图片描述

5.录制视频

代码格式为:rosbag record +RGB图像的topic+空格+depth图像的topic -O +路径/文件名

rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -O /home/midea/video/1

演示如下:
请添加图片描述

运行此行代码即可开始录制。
按“ctrl+c”停止录制。
录制完后指定目录下会有一个“1.bag”的文件:
请添加图片描述

注意:录制视频的代码中是大写的O
补充 大写的O与小写o的区别:

  • 小写o默认以录制的时间命名文件
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -o /home/midea/video/

可以看到会出现一个以时间为命名的bag文件:_2022-12-23-17-48-10.bag
在这里插入图片描述若是在后面填上自定义的名称:

rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -o /home/midea/video/2

则效果为在原本的时间前面添上自定义的名称:2_2022-12-23-17-54-51.bag (这里后缀多了一个".active",是因为还在录制中,录制结束了“.active"后缀就消失了。
请添加图片描述

  • 大写O可以将文件名修改为自定义的名称
    代码:
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -O /home/midea/video/3

效果如下:
请添加图片描述

6.播放录制的视频

播放视频前先将连着相机的数据线拔掉。
然后输入下面的代码:

rosbag play /home/midea/video/1.bag

即可在相机显示界面的左下角看到录制的内容:
请添加图片描述

二. 另一种显示话题的方式

rqt_image_view

输入此代码,即可打开显示话题的界面:
请添加图片描述也可以在此查看录制的话题。

三. 将视频拆分成每帧,并分开存储RGB和Depth图像

文件名称为:bag2tum.py
代码:

#!/usr/bin/env python
# # coding:utf-8

# Extract images from a bag file.
 
#PKG = 'beginner_tutorials'
import argparse
import roslib;   #roslib.load_manifest(PKG)
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
 
# Reading bag filename from command line or roslaunch parameter.
import os
#import sys

class ImageCreator():
    def __init__(self):
        self.bridge = CvBridge()
        with rosbag.Bag(bag_file, 'r') as bag:  #要读取的bag文件;
            for topic,msg,t in bag.read_messages():
                #print(t)
                if topic == "/camera/color/image_raw": #图像的rgb topic;
                        try:
                            cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                        except CvBridgeError as e:
                            print (e)
                        timestr = "%.6f" %  msg.header.stamp.to_sec()
                        #%.6f表示小数点后带有6位,可根据精确度需要修改;
                        image_name = timestr+ ".png" #图像命名:时间戳.png
                        cv2.imwrite(rgb_path + image_name, cv_image)  #保存;
                        with open(rgbstamp, 'a') as rgb_time_file:
                            rgb_time_file.write(timestr+" rgb/"+image_name+"\n")
                elif topic == "/camera/depth/image_rect_raw": #图像的depth topic;
                        try:
                            cv_image = self.bridge.imgmsg_to_cv2(msg,"16UC1")
                        except CvBridgeError as e:
                            print (e)
                        timestr = "%.6f" %  msg.header.stamp.to_sec()
                        #%.6f表示小数点后带有6位,可根据精确度需要修改;
                        image_name = timestr+ ".png" #图像命名:时间戳.png
                        cv2.imwrite(depth_path + image_name, cv_image)  #保存;
                        with open(depthstamp, 'a') as depth_time_file:
                            depth_time_file.write(timestr+" depth/"+image_name+"\n")
 
if __name__ == '__main__':
 
    #rospy.init_node(PKG)
 
    try:
        bag_file=input('请输入文件路径:')
        new_dataset_path=input('请输入生成数据集路径:')
        rgb_path = new_dataset_path+'/rgb/'
        depth_path= new_dataset_path+'/depth/'
        rgbstamp= new_dataset_path+'/rgb.txt' 
        depthstamp= new_dataset_path+'/depth.txt'
        if not os.path.exists(rgb_path):
            os.makedirs(rgb_path)
        if not os.path.exists(depth_path):
            os.makedirs(depth_path)
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

需要将以下两行代码作修改,改为自己的RGB图像和Depth图像的topic路径:

if topic == "/camera/color/image_raw": #图像的rgb topic;
elif topic == "/camera/depth/image_rect_raw": #图像的depth topic;

在代码所在文件夹的终端运行此代码,运行的命令为:

python bag2tum.py

我这里报错:
请添加图片描述
没有关系,把"python"改为“python3”即可,然后提示输入文件路径,将录制好的bag文件的路径输入,回车。
请添加图片描述
填入要将生成的数据集存放的路径。
请添加图片描述
回车后即可在对应的目录下查看生成的内容:
请添加图片描述
depth图像和rgb图像分别存储在不同的文件夹中,depth.txt和rgb.txt中存储两列信息,第一列是录制的时间戳,第二列是图像的路径。

总结

至此就完成了从相机中提取RGB图像和Depth图像的步骤了。

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

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

相关文章

智能高效的Go IDE——GoLand v2022.3全新发布

GoLand使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议,通过一步撤消快速安全重构,智能代码完成,死代码检测和文档提示帮助所有 Go 开发人员,从新手到经验丰富的专业人士,创建快速、高效、和可靠的…

javac和java命令详解

javac 是java语言编程编译器。全称java compiler。相信大家在学习java编程的时候,一定使用过javac和java这两个命令。大家在安装JDK的时候,验证是否安装成功,都会在命令行里输入java和javac命令来验证,这就是我们第一次使用java和…

PDF怎么编辑注释? 5 个免费好用的 PDF 注释器

成群结队的人和组织想要注释他们的 PDF 文档的原因有很多。无论哪种情况,目标是做到近乎完美并不是完美。但是,如果您没有合适的 PDF 注释器,这又是不可能的。虽然这些 PDF 注释器工具中的许多都很昂贵,但您仍然可以使用免费的 PD…

tkintertools 模块实战一:任务清单小工具

之前我自己写了一个 tkinter 模块的辅助模块 —— tkintertools,这次试着用这个模块开发了一款可以记录任务的小工具,应该会比较实用。tkinter 模块的最强辅助模块 —— tkintertools(万字详解)_小康2022的博客-CSDN博客tkinter 模…

数字图像处理实验(直方图均衡化规定化)

图像均衡化 图像均衡化是一种图像处理技术,它的目的是改善图像的对比度。 具体来说,对于一张图像,其直方图就是统计图像中各灰度级出现的次数的图像。通常情况下,图像的直方图会呈现不平衡的状态,即图像的某些灰度级出…

SQLSERVER 的主键索引真的是物理有序吗?

一:背景 1. 讲故事 最近在看 SQL SERVER 2008 查询性能优化,书中说当一个表创建了聚集索引,那么表中的行会按照主键索引的顺序物理排列,这里有一个关键词叫:物理排列,如果不了解底层原理,真的…

5G NR标准: 第18章 射频特性

第18章 射频特性 如第 3 章所述,NR 的射频特性与 5G 的可用频谱以及在这些频谱分配中运行所需的频谱灵活性密切相关。 虽然频谱灵活性一直是前几代移动系统的基石,但对于 NR,这一点变得更加突出。 它由几个组成部分组成,包括在不…

C++11 线程异步

文章目录1. 线程异步的概念2. future2.1 共享状态2.2 常用成员函数3. promise3.1 常用成员函数3.2 promise的基本使用4. package_task4.1 常用成员函数4.2 package_task的基本使用5. async5.1 async的基本使用6. promise、package_task、async的对比与总结1. 线程异步的概念 问…

干货 | 读懂 Appium 日志,让测试效率翻倍!

Appium 服务器运行时会产生很多日志,但是很多人并不了解其中的意义,也无法掌握有用的信息。本文将详细解读如何读懂 Appium 日志,并让你的测试效率翻倍。开启服务日志第一行显示了 Appium 版本和运行地址。$ appium[Appium] Welcome to Appiu…

曾经对程序员最好的公司,倒下了

硅谷有一家公司,它发明了同时代最好的CPU,最好的操作系统,最好的编程语言,但是由于傲慢和目光短浅,在短短二十多年间就走到了尽头。它就是Sun Microsystems,硅谷最让人惋惜的公司。1Sun的出现是个巧合。80年…

运动蓝牙耳机哪个品牌好、2023年最出色运动蓝牙耳机推荐

上班通勤、娱乐和运动时间都需要一款耳机的陪伴。相信音乐是许多健身爱好者锻炼时的必备,在枯燥的运动中用音乐分散注意力,不仅可以提高运动的积极性,还能让身体产生一种非常奇妙的愉悦感。不过,想要在运动中获得更好的聆听体验&a…

【图像处理OpenCV(C++版)】——3.2 几何变换之投影变换

前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…

前端高频vue面试题总结

created和mounted的区别 created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。 如何从真实DOM到虚拟DOM …

springboot 全局 Date参数接收 String格式 转换异常报错

报错: .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.util.Date from String "2022-12-13 11:22:11": not a v…

C语言实现c++对象和私有成员

C语言实现c对象和私有成员 C语言实现c对象 类是C中面向对象编程思想中比较重要的组成部分,与结构体一样类只是一个模板只有在创建对象时才会申请内存空间,类其实是把具有共同特性的数据或方法(面向对象编程中,一般把函数称为方法…

录屏软件哪个好用?10个免费好用的「录屏软件」推荐

想知道如何录制自己的流媒体视频吗?有几个选项可以让您免费录制流媒体视频:桌面屏幕录像机、在线工具、浏览器扩展、iOS 应用程序和 Android 应用程序。 查看下表以获取有关不同直播流媒体录像机的更多信息:它们的主要用途和运行的操作系统。…

基于YOLOV5的火灾检测系统(含模型)+GUI界面

基于YOLOV5的火灾检测系统 本期我们带来的内容是基于YOLOV5的火灾检测系统,火灾检测系统还是比较有实际意义的,也方便大家在背景描述中展开。废话不多说,还是先看效果。 完整代码下载地址:基于YOLOV5的火灾检测系统(含模型&…

MySQL高级 SQL优化【limitcountupdate优化】

目录 1:SQL优化 1.1:limit优化 1.2:count优化 1.2.1:概述 1.2.2:count用法 1.3:update优化 1:SQL优化 1.1:limit优化 在数据量比较大时,如果进行limit分页查询&a…

拉伯配资|战略新兴产业火了,高增长低估值股曝光

导读:2022年,A股商场值得记录的前史性大事件不断。这一年,A股商场上市公司数量正式打破5000家,战略新兴工业上市公司数量打破2500家,占比初次打破50%大关。这一年,A股商场顶住杂乱的外部环境要素&#xff0…

一文读懂:什么是CRM?企业如何通过CRM盈利?

今天和大家分享一篇干货文章,主要探讨什么是CRM,用大白话解释企业究竟如何通过CRM盈利。文章有点长,但看完,相信你会有所收获。 一、什么是CRM CRM——客户关系管理系统,它不仅是一个系统,一个技术解决方案…