You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS Kinetic环境Python用OpenCV读取摄像头显示空白问题求助

ROS Kinetic Python调用OpenCV访问摄像头空白问题解决方案

你遇到的核心问题是订阅的压缩图像话题与使用的消息类型、转换接口不匹配,具体修复方法如下:

  • 导入压缩图像专用的消息类型:替换原Image导入逻辑,增加CompressedImage类型支持
  • 修改订阅器的消息类型参数:将Subscriber中第二个参数从Image改为CompressedImage
  • 替换cv_bridge转换接口:压缩图像不能使用imgmsg_to_cv2解析,需要使用专用的compressed_imgmsg_to_cv2方法
  • 可选:将转换编码从passthrough改为bgr8,适配OpenCV默认的色彩通道顺序,避免画面颜色错位

修正后可运行的完整代码

#!/usr/bin/env python2.7
import rospy
from sensor_msgs.msg import CompressedImage
import cv2
from cv_bridge import CvBridge, CvBridgeError

rospy.init_node('opencv_example', anonymous=True)
bridge = CvBridge()

def show_image(img):
    cv2.imshow("Image Window", img)
    cv2.waitKey(3)

def image_callback(img_msg):
    try:
        # 改用压缩图像专用转换接口
        cv_image = bridge.compressed_imgmsg_to_cv2(img_msg, "bgr8")
    except CvBridgeError as e:
        rospy.logerr("CvBridge Error: {0}".format(e))
        return
    
    show_image(cv_image)

# 修改订阅的消息类型为CompressedImage
sub_image = rospy.Subscriber("/raspicam_node/image/compressed", CompressedImage, image_callback)
cv2.namedWindow("Image Window", 1)

while not rospy.is_shutdown():
    rospy.spin()

# 节点退出时销毁OpenCV窗口
cv2.destroyAllWindows()

可选替代方案

如果你不需要使用压缩传输,也可以直接订阅未压缩的原始图像话题/raspicam_node/image/,原有代码不需要修改即可正常运行,仅会提升话题传输的带宽占用。

内容的提问来源于stack exchange,提问作者Anto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:54:02