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

这篇具有很好参考价值的文章主要介绍了使用ros从realsence相机中获取图像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一部分 从相机中提取出视频并拆分成帧


前言

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


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

1.开启ros内核

代码如下(示例):

roscore

演示如下:
使用ros从realsence相机中获取图像

2.打开realsense相机

代码如下(示例):

roslaunch realsense2_camera demo_pointcloud.launch

演示如下:
使用ros从realsence相机中获取图像
打开界面如下图:

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

3.查看当前话题

代码如下(示例):

rostopic list

演示如下:
使用ros从realsence相机中获取图像
说明:
“/camera/color/image_raw” 是RGB图像的话题;
“/camera/depth/image_rect_raw” 是depth图像的话题。

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

4.1 添加Image

点击左下角的“ADD”,出现中间的界面;选择“Image“;点击”OK“。
使用ros从realsence相机中获取图像

4.2 填入RGB话题

展开左边的“Image",在“Image Topic"填入RGB图像的话题,即可在左下角成功显示出RGB图像。
使用ros从realsence相机中获取图像

4.3 填入depth话题

继续按照4.1进行添加,再按照4.2在“Image Topic”中填入depth图像的话题,即可在左下角也显示出深度图的图像。使用ros从realsence相机中获取图像

5.录制视频

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

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

演示如下:
使用ros从realsence相机中获取图像

运行此行代码即可开始录制。
按“ctrl+c”停止录制。
录制完后指定目录下会有一个“1.bag”的文件:
使用ros从realsence相机中获取图像

注意:录制视频的代码中是大写的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
使用ros从realsence相机中获取图像若是在后面填上自定义的名称:

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"后缀就消失了。
使用ros从realsence相机中获取图像

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

效果如下:
使用ros从realsence相机中获取图像

6.播放录制的视频

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

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

即可在相机显示界面的左下角看到录制的内容:
使用ros从realsence相机中获取图像

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

rqt_image_view

输入此代码,即可打开显示话题的界面:
使用ros从realsence相机中获取图像也可以在此查看录制的话题。

三. 将视频拆分成每帧,并分开存储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

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

总结

至此就完成了从相机中提取RGB图像和Depth图像的步骤了。文章来源地址https://www.toymoban.com/news/detail-429540.html

到了这里,关于使用ros从realsence相机中获取图像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ArcGIS Pro工具一部分解释

    序号 工具 功能介绍 1.  打包工程(PackageProject) 把工程所有内容打包一个文件 2.      合并工程(ConsolidateProject) 把工程和数据整理到同一个文件夹下 3.      要素转线(FeatureToLine) 把面要素转线要素或线要素打断 4.      定义投影(DefineProjection)

    2024年02月16日
    浏览(34)
  • C++11常用的一部分新特性

    C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自 定义的类型,使用初始化列表时,可添加等号(=),也可不添加。 也就是说这里用花括号进行初始化调用的是类的构造。 也就是说,C++11几乎可以一切都可以用花括号初始化,包括变

    2024年02月06日
    浏览(31)
  • 常规技术面试题(.NET)下一部分

     (我只是个努力的搬运工,别人整理的,暂时发布,供我自己复习的。) 目录 1.你对泛型了解吗?简单说明一下泛型的有什么好处? 6.2  .NET WinForm部分 6.3  .NET Web开发部分 6.4  数据访问部分 6.5  集群与分布式 6.6  其他部分 泛型:“泛型”的字面意思就是广泛的类型。通

    2024年02月08日
    浏览(33)
  • git 如何提交一个文件的一部分内容

    场景: 我正在开发代码开发了一半,现在突然要提交代码,但是需要提交的代码和我正在开发的代码 在一个文件中,我该如何提交 命令: git add -p (p是patch缩写) 第一步 :输入命令之后会呈现代码修改的部分 绿色的注释就是新增加内容 第二步: 按回车键查看命令解释 这

    2024年02月11日
    浏览(32)
  • jenkins汉化一部分问题(一半中文一半英文)解决

    安装中文插件“Locale plugin”和“Localization: Chinese (Simplified)后,先设置为zh_US重新启动,再设置回来 其他插件重启Jenkins后,又出现了部分中文简体不翻译的情况。 方法如下,可以临时完美修复。 1. 将语言设定为zh_US,Jenkins切换为英文。 2. 调用restart重启Jenkins:http://jenkisn网址

    2024年02月11日
    浏览(47)
  • 第三十一部分:大模型在搜索引擎领域

    在过去的几年里,搜索引擎技术发展迅速,从简单的查询到智能的语义搜索和知识图谱。随着大模型在自然语言处理(NLP)和计算机视觉等领域的成功应用,搜索引擎也开始逐渐引入大模型技术,以提高搜索质量和用户体验。本文将从大模型在搜索引擎领域的背景、核心

    2024年02月20日
    浏览(35)
  • Git合并固定分支的某一部分至当前分支

    在 Git 中,通常使用 git merge 命令来将一个分支的更改合并到另一个分支。如果你只想合并某个分支的一部分代码,可以使用以下两种方法: 首先,从要合并的源分支(即要提取代码的分支)中创建并切换到一个新的临时分支。这样可以在该分支上进行修改,以便选择性地合

    2024年02月21日
    浏览(44)
  • [云原生] 二进制安装K8S一部分

    目前Kubernetes最新版本是v1.25,但大部分公司一般不会使用最新版本。 目前公司使用比较多的:老版本是v1.15,因为v1.16改变了很多API接口版本,国内目前使用比较多的是v1.18、v1.20。  组件部署: mater节点 mater01 192.168.136.100 kube-apiserver kube-controller-manager kube-scheduler etcd        

    2024年02月22日
    浏览(29)
  • RV1126与RV1109 AI系统设计概要(一部分)

            四核核 Cortex-A7,ARM架构V7-A指令,独立Neon SIMD(一种高级单指令多数据扩展指令集,可执行并行数据处理),与独立FPU(浮点计算)。 (RV1109双核A7)         每核有32KB L1 I-Cache(一级指令高速缓存),32KB L1 D-Cache(一级数据高速缓存)         512KB L2 Cache(二极

    2024年02月07日
    浏览(34)
  • AD18批量修改一部分或者全部器件位号的方法!

           现在任何一个公司嵌入式硬件开发的主板全都是有很多sheet的,而硬件工程师做的往往也都是在老的图纸上进行修改或者再设计,也正因为如此,我们在画原理图的时候尽量不要去改动已有部分的位号,以免PCB工程师骂人! 就算自己画PCB的时候也会晕头转向!      

    2024年01月17日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包