遵循cv_bridge入门教程遇阻:ROS图像转OpenCV无输出问题求助
解决cv_bridge节点无输出、话题不匹配的问题
你猜的完全正确!核心问题就是订阅的话题和Kinect实际发布的话题不匹配,导致你的image_converter节点根本收不到任何图像数据,自然没有输出。结合你提到的现象,我给你一步步梳理解决方案:
1. 先确认Kinect的实际图像话题
首先打开终端,运行以下命令查看当前活跃的ROS话题:
rostopic list
你会看到Kinect发布的一系列话题,其中彩色图像的话题应该是/camera/rgb/image_color(这也是你尝试用image_view查看的话题)。为了确认这个话题确实有数据,可以运行:
rostopic hz /camera/rgb/image_color
如果输出类似average rate: 30.00这样的信息,说明话题在正常发布数据。
2. 修改代码中的订阅话题
你的代码里订阅的是/camera/image_raw,但Kinect并没有发布这个话题,所以直接修改代码中的订阅语句:
把:
image_sub_ = it_.subscribe("/camera/image_raw", 1, &ImageConverter::imageCb, this);
改成:
image_sub_ = it_.subscribe("/camera/rgb/image_color", 1, &ImageConverter::imageCb, this);
另外注意:Kinect发布的/camera/rgb/image_color话题编码通常是rgb8,而你代码里用的是sensor_msgs::image_encodings::BGR8——不过不用担心,cv_bridge会自动帮你完成RGB到BGR的转换,这一步不需要额外修改。如果还是担心,可以改成显式指定编码:
cv_ptr = cv_bridge::toCvCopy(msg, "bgr8");
3. 解决image_view的报错问题
你运行image_view时出现的GLib-GObject-CRITICAL错误,大概率是图像传输方式或者依赖的小问题,可以试试以下方法:
- 显式指定原始图像传输方式运行:
rosrun image_view image_view image:=/camera/rgb/image_color image_transport:=raw - 检查并重新安装image_view依赖(替换成你的ROS版本,比如melodic/noetic):
sudo apt-get install ros-noetic-image-view - 重启所有ROS节点(包括openni和image_view),有时候是临时的资源释放问题导致的。
4. 调试与验证
修改代码后,重新编译运行:
catkin_make source devel/setup.bash rosrun 你的包名 image_converter
然后可以做这些验证:
- 在
imageCb函数开头加一句日志打印,确认是否收到图像:
如果终端不断打印这条日志,说明节点已经正常接收数据了。void imageCb(const sensor_msgs::ImageConstPtr& msg) { ROS_INFO("Successfully received an image!"); // 新增这句 cv_bridge::CvImagePtr cv_ptr; // ... 后面的代码不变 } - 用
rqt_image_view查看你节点发布的/image_converter/output_video话题,应该能看到带有红色圆圈的图像。 - 再看
rqt_graph,你的image_converter节点应该和openni_node建立了连接,不再是孤立的叶节点。
内容的提问来源于stack exchange,提问作者8489faustn
相关产品推荐
相关产品推荐

