ros保存图片
若需格式转换,需手动指定 encoding 参数(如 sensor_msgs::image_encodings::BGR8),但转换时仍可能依赖原始数据的内存布局。即使原始 ROS 消息被销毁(如超出作用域),转换后的 cv::Mat 仍可正常使用,且其生命周期由 OpenCV 管理(自动释放内存)。必须保证原始 ROS 消息在 cv::Mat 使用期间始终有效(即未被销毁),否则 cv::Mat
cv_bridge::toCvCopy 和 cv_bridge::imgmsg_to_cv2 的区别是什么cv_bridge::toCvCopy 和 cv_bridge::imgmsg_to_cv2 都是 ROS 中用于将 sensor_msgs/Image 消息转换为 OpenCV 图像(cv::Mat)的核心函数,但它们在内存管理和使用场景上有关键区别,具体如下:
一、核心区别:是否 “拷贝数据”
两者的核心差异在于转换时是否会创建新的内存副本,这直接影响内存占用和效率:
-
cv_bridge::toCvCopy
行为:会创建一个新的 cv::Mat 对象,并将 ROS 图像消息中的数据拷贝到这个新对象中。
内存管理:新的 cv::Mat 拥有独立的内存空间,与原始 ROS 消息的内存完全分离。即使原始 ROS 消息被销毁(如超出作用域),转换后的 cv::Mat 仍可正常使用,且其生命周期由 OpenCV 管理(自动释放内存)。
格式指定:需要显式指定目标图像格式(如 “bgr8”、“mono8”),若原始格式与目标格式不一致,会自动进行格式转换(如 16 位深度图转 8 位灰度图)。 -
cv_bridge::imgmsg_to_cv2
行为:不创建新内存副本,而是返回一个指向 ROS 图像消息内存的 cv::Mat 引用(或指针)。
内存管理:转换后的 cv::Mat 与原始 ROS 消息共享内存。必须保证原始 ROS 消息在 cv::Mat 使用期间始终有效(即未被销毁),否则 cv::Mat 会访问无效内存,导致程序崩溃(悬空指针问题)。
格式限制:默认要求原始 ROS 图像的格式与目标格式完全一致(如原始是 “bgr8”,目标也必须是 “bgr8”),否则会报错。若需格式转换,需手动指定 encoding 参数(如 sensor_msgs::image_encodings::BGR8),但转换时仍可能依赖原始数据的内存布局。
cv_bridge.toCvCopy(img_msg, encoding="passthrough")
img_msg: 输入的 ROS 图像消息 (sensor_msgs/Image)。
encoding: 目标图像编码格式(例如 "bgr8"、"mono8"、"rgb8" 等)。默认值为 "passthrough",表示不改变原始编码。
返回值:返回一个 CvBridge 对象,其中包含转换后的 OpenCV 图像数据。你需要通过 .image 属性来获取 numpy 数组格式的图像
如果你使用 ROS1,可直接用 image_view 的 image_saver 工具:
rosbag play your.bag
rosrun image_view image_saver image:=/camera/color/image_raw _save_all_image:=true
举例:
rosrun image_view image_saver image:=/camera/left/image_raw _save_all_image:=true _filename_format:="left_%04d.png"
rosrun image_view image_saver image:=/camera/right/image_raw _save_all_image:=true _filename_format:="right_%04d.png"
rosrun image_view image_saver image:=/camera/depth/image_raw _save_all_image:=true _filename_format:="depth_%04d.png"
rosbag play your.bag
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)