从rosbag解析视频

该博客介绍了如何在ROS环境中解析ROS bag文件中的图像,并使用ffmpeg将解析出的图片序列转换为视频。主要步骤包括安装必要的包 mjepgtools 和 ffmpeg,通过roslaunch命令播放bag文件并提取图像,最后利用ffmpeg将图片合成为视频。

1.使用的包

sudo apt-get install mjepgtools
sudo apt-get install ffmpeg

2.解析图片

roslaunch bag2jpg.launch
<launch>
      <node pkg="rosbag" type="play" name="rosbag" args="-d 2 /media/nvidia/'My Passport'/camera_rosbag/2021-08-19-15-20-12.bag"/>
      <node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
    <remap from="image" to="/zed/zed_node/right_raw/image_raw_color"/>
      </node>
    </launch>

3.转视频

ffmpeg -r 15  -i /path/frame%04d.jpg test.mp4
### 如何解析 ROSBag 中的图像数据 解析 `rosbag` 文件中的图像数据可以通过多种方法实现,具体取决于使用的编程环境以及需求复杂程度。以下是几种常见的方法及其工具: #### 方法一:通过命令行提取图像 可以利用 ROS 提供的内置功能来快速提取图像数据并将其保存为文件形式。例如,使用 `image_view` 节点可以从指定话题中提取图像帧。 运行以下命令可以在终端中完成这一操作: ```bash rosrun image_view extract_images _sec_per_frame:=<time_interval> image:=<topic_name> ``` 其中 `<time_interval>` 表示每张图片之间的时间间隔(单位为秒),而 `<topic_name>` 则是发布图像消息的话题名称[^2]。 #### 方法二:编写 Python 或 C++ 程序读取图像数据 对于更复杂的场景或者需要进一步处理的情况,则建议开发自定义脚本来访问这些信息。下面分别介绍基于两种主流语言——Python 和 C++ 的决方案。 ##### 使用 Python 进行读取 借助于官方支持库 `rospy` 可轻松加载 `.bag` 文件内容,并从中筛选出所需的传感器消息类型如 `sensor_msgs/Image` 。之后再调用 OpenCV 库将原始字节流转换成便于后续分析的形式。 代码样例如下所示: ```python import rospy import rosbag from cv_bridge import CvBridge, CvBridgeError import cv2 def read_rosbag_image(bag_file_path, topic_name): bridge = CvBridge() with rosbag.Bag(bag_file_path, 'r') as bag: for _, msg, t in bag.read_messages(topics=[topic_name]): try: # Convert the ROS Image message to a CV2 image cv_img = bridge.imgmsg_to_cv2(msg, desired_encoding="bgr8") # Optionally save or process each frame here cv2.imwrite(f'frame_{t.to_sec()}.png', cv_img) except CvBridgeError as e: print(e) if __name__ == "__main__": bag_filepath = "/path/to/bagfile.bag" img_topic = "/camera/color/image_raw" read_rosbag_image(bag_filepath, img_topic) ``` 此段程序会遍历给定主题下的所有记录项并将它们逐一转化为标准格式存储下来以便后期查看或计算[^3]。 ##### 使用 C++ 实现相同目标 如果偏好性能更高的方式可以选择采用 C++ 编写相应逻辑。同样依赖于 `cv::bridge` 来桥接不同框架之间的差异之处。 实例片段如下: ```cpp #include <ros/ros.h> #include <rosbag/bag.h> #include <rosbag/view.h> #include <sensor_msgs/Image.h> #include <opencv2/highgui.hpp> int main(int argc, char **argv){ std::string bag_filename("/path/to/your_bag_file"); std::vector<std::string> topics; topics.push_back(std::string("/camera/color/image_raw")); rosbag::Bag bag; bag.open(bag_filename.c_str(), rosbag::bagmode::Read); rosbag::View view(bag, rosbag::TopicQuery(topics)); int count=0; BOOST_FOREACH(rosbag::MessageInstance const m, view){ sensor_msgs::ImageConstPtr imsg = m.instantiate<sensor_msgs::Image>(); if(imsg != NULL){ cv_bridge::CvImagePtr cv_ptr; try{ cv_ptr = cv_bridge::toCvCopy(imsg, sensor_msgs::image_encodings::BGR8); // Save images sequentially. cv::imwrite("output"+std::to_string(count++)+".jpg", cv_ptr->image); }catch (cv_bridge::Exception& e){ ROS_ERROR("Could not convert from '%s' to 'bgr8'.", imsg->encoding.c_str()); } } } bag.close(); } ``` 以上展示了另一种途径用于获取封装好的视觉资料集[^1]。 --- ### 工具推荐 除了手动编码之外还有几个专门设计用来简化此类任务流程的应用可供选用: - **Rqt Bag Viewer**: GUI界面应用程序允许用户直观地浏览各种类型的ROS通信流量其中包括视频序列。 - **Matlab Toolbox For Robotics**: 支持导入`.bag`档案并通过图形化手段展示其内部结构同时提供API接口方便二次开发人员集成至其他项目当中去[^1].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值