ROS-1 杂谈_02
方法一:(提取的图像不带时间戳)
- 新建一个文件夹,将想要读取的包放入
- 终端执行以下代码,在文件夹中建立一个 export.launch 文件
cd 到第一步建好的文件夹下
touch export.launch
- 在 export.launch 文件中写入以下内容
<launch>
<node pkg="rosbag" type="play" name ="rosbag" args="-d 2 /rosbag的绝对路径/包名.bag"/>
<node name= "extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="/camera/color/image_raw"/>
</node>
</launch>
- 打开终端,运行roscore
roscore
- 新建终端,运行 export.launch 文件
cd 到第一步建立好的文件夹下
roslaunch export.launch
6.提取成功,提取后的图片保存在了home下的.ros目录中
方法二:(提取的图像带时间戳)
- 创建ReadImg.py文件,将下文代码放入文件中(注意修改:ROS bag的路径以及想要提取的图像的topic)
#coding:utf-8
import roslib
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
path='/***/***/***/' #存放图片的位置
class ImageCreator():
def __init__(self):
self.bridge = CvBridge()
with rosbag.Bag('***.bag', 'r') as bag: #要读取的bag文件;
for topic,msg,t in bag.read_messages():
if topic == "/***/***/***/": #图像的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 + ".jpg" #图像命名:时间戳.jpg
cv2.imwrite(path+image_name, cv_image) #保存;
if __name__ == '__main__':
#rospy.init_node(PKG)
try:
image_creator = ImageCreator()
except rospy.ROSInterruptException:
pass
- 移动到ReadImg.py文件所在的位置,终端输入
python ReadImg.py
- 稍等片刻,提取结束。提取后的图片将保存在path指定的目录下。