如何将rosbag中字节串格式图像转换为OpenCV图像(禁用ROS工具)
无CV_Bridge时Rosbag图像转Numpy/OpenCV图像的解决方案
问题根源
用bagpy导出的DataFrame里,data列的图像数据是被字符串化的字节串(显示为b'\xff\xd8...'这种形式),不是原生的bytes类型,直接用np.fromstring()会返回None,因为它处理的是字符串文本而非实际字节流。
分步解决
1. 还原原生字节对象
用Python标准库的ast.literal_eval()解析字符串,能准确把b'xxx'格式的字符串转回真正的bytes数据,比手动截取字符串更可靠。
2. 解码字节流为图像
Rosbag里的图像基本是压缩格式(比如JPEG),不能直接reshape成数组,得用OpenCV的cv2.imdecode()从字节流解码。如果需要RGB格式,记得把OpenCV默认的BGR转成RGB。
完整代码示例
import ast import numpy as np import cv2 import pandas as pd from bagpy import bagreader # 读取rosbag并生成图像话题的DataFrame bag = bagreader('your_bag_file.bag') image_df = pd.read_csv(b.message_by_topic('/camera/image_raw')) # 替换成你的图像话题 # 遍历处理每帧图像 for _, row in image_df.iterrows(): # 把字符串化的字节串转回原生bytes img_bytes = ast.literal_eval(row['data']) # 从字节流解码为OpenCV图像 img_buffer = np.frombuffer(img_bytes, dtype=np.uint8) img_cv = cv2.imdecode(img_buffer, cv2.IMREAD_COLOR) # 可选:转换为RGB格式(根据后续处理需求) img_rgb = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB) # 验证输出形状(比如1080x1920x3) print(f"当前图像形状: {img_cv.shape}") # 后续处理示例 # cv2.imshow('Processed Image', img_cv) # cv2.waitKey(1)
特殊情况处理(未压缩图像)
如果你的图像是raw格式(比如rgb8编码),不需要用imdecode,直接结合图像的宽高reshape即可:
# 假设row包含height、width字段,编码为rgb8 img_raw = np.frombuffer(img_bytes, dtype=np.uint8).reshape(row['height'], row['width'], 3) img_cv = cv2.cvtColor(img_raw, cv2.COLOR_RGB2BGR)
内容的提问来源于stack exchange,提问作者BeginnersMindTruly
相关产品推荐
相关产品推荐

