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
相关产品推荐
相关产品推荐

