第一部分 从相机中提取出视频并拆分成帧
文章目录
- 第一部分 从相机中提取出视频并拆分成帧
- 前言
- 一、使用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图像的步骤了。
文章出处登录后可见!