使用raspicam_node启用RAW图像流及订阅报错问题求助
问题根因
该报错是raspicam_node输出RAW图像时的元数据不匹配问题,属于官方已知的版本bug:节点实际输出的是单通道拜尔原始数据,但默认将图像编码格式错误声明为3通道的bgr8,导致订阅端按照bgr8的规则校验图像尺寸时出现height * step != 数据实际长度的不匹配问题。
可落地的解决方法
按优先级依次尝试以下方案即可:
- 方案1:启动时显式指定RAW图像的编码格式
将原有启动命令修改为:
该参数会强制节点输出RAW图像时使用拜尔格式的编码声明,从根源避免格式误标的问题,90%以上的同类型报错都可以通过该方案解决。roslaunch raspicam_node camerav2_1280x720.launch enable_raw:=true raw_format:=bayer_rggb8 - 方案2:切换无bug的分辨率版本
如果方案1无效,可直接使用1280x960分辨率的启动文件,该分辨率下raspicam_node的步长计算无已知兼容问题:roslaunch raspicam_node camerav2_1280x960.launch enable_raw:=true - 方案3:订阅端手动修正元数据
若业务必须使用1280x720分辨率,可在订阅回调中先修正图像元数据再做后续处理,Python示例代码如下:import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge bridge = CvBridge() def raw_img_cb(msg): # 修正错误的步长与编码声明 if msg.encoding == "bgr8" and msg.height == 720: msg.encoding = "bayer_rggb8" msg.step = msg.width # 单通道拜尔格式步长等于图像宽度 # 转换为CV格式正常处理 cv_img = bridge.imgmsg_to_cv2(msg, "bgr8") # 后续业务逻辑
小提示:如果使用
rqt_image_view做订阅测试,需要手动在界面顶部的编码下拉框选择bayer_rggb8,不要使用默认自动检测,避免触发不必要的格式转换报错。
内容的提问来源于stack exchange,提问作者Anto
相关产品推荐
相关产品推荐

