以下两种环境均在Ubuntu16.04环境下测试成功。
第一种方法
ROS-从rosbag中提取图像(by launch文件)
1.新建launch文件(文件在哪无所谓,可以在catkin_ws的根目录) : bag2img.launch
<launch>
<node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/andy/bag_foler/file_name.bag"/>
<node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="camera/rgb/image_color"/>
<param name="sec_per_frame" value="0.03"/>
</node>
</launch>
note:
/home/andy/bag_foler/file_name.bag
为你录制的bag文件的绝对路径,camera/rgb/image_color
为你提取的topic的名字,你可以使用:
rosbag info file_name.bag
查看你需要提取的图片的topic名字。< param name="sec_per_frame" value="0.03"/>
这句话是说,以每一帧花费0.03s的时间,这个条件对你的bag文件进行图像提取,如果没有这句话,就是默认0.1s,也就是没秒10帧的速率对图像提取。经过我的测试发现,无论怎么调整这个值,都无法跟bag文件中的信息数目匹配,因此来说,这种方法存在一定的图像缺失的情况,只能无限接近袁原始图像的数目,比如我的原始数据有640帧,但经过调整sec_per_frame的值,最高的时候还是只能到639,多数情况下到637,默认值0.1的时候,只有200多张图像。
2.运行launch
roslaunch bag2img.launch
那么已经提取成功的图像存储在你home文件夹下的.ros文件夹下,一般是隐藏的文件夹,使用crtl+h可显示出来。
优点:操作简单,使用ros即可;缺点:提取信息与原始录制的信息并不完全一致,主要体现在提取的图片数量和ros录制的时候的信息数量不一致,会少。此外,不含有时间戳;
第二种方法
ROS-从rosbag中提取图像(by python2)
通过编写Python程序按照我们想要的信息及方式来提取,在与bag文件同级目录下建立.py文件(方便操作,若不是同级目录,下面代码中要写绝对路径)
import roslib;
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
rgb_path = '/home/david/workspace/bags/rgb/'
depth_path= '/home/david/workspace/bags/depth/'
class ImageCreator():
def __init__(self):
self.bridge = CvBridge()
with rosbag.Bag('/home/andy/bag_folder/file_name.bag', 'r') as bag:
for topic,msg,t in bag.read_messages():
if topic == "camera/rgb/image_raw":
try:
cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
except CvBridgeError as e:
print e
timestr = "%.6f" % msg.header.stamp.to_sec()
image_name = timestr+ ".png"
cv2.imwrite(rgb_path + image_name, cv_image)
elif topic == "camera/depth_registered/image_raw":
try:
cv_image = self.bridge.imgmsg_to_cv2(msg,"16UC1")
except CvBridgeError as e:
print e
timestr = "%.6f" % msg.header.stamp.to_sec()
image_name = timestr+ ".png"
cv2.imwrite(depth_path + image_name, cv_image)
if __name__ == '__main__':
try:
image_creator = ImageCreator()
except rospy.ROSInterruptException:
pass
优点:没有信息损失,完全按照你录制的数据完整提取,且具有时间戳。缺点:使用python2,不依赖ros,这个可能也不算是缺点。依赖OpenCV,我使用的OpenCV版本为3.3.1,3.x版本都可以,2.x版本没有尝试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)