当前位置:   article > 正文

ROS将OpenCV图像转换为Image话题发布_ros发布图像话题

ros发布图像话题

需求:将TUM数据集中rgb图像和depth图像分别作为Image类型的话题发布。ROS中提供了cv_bridge类帮助我们在ROS和OpenCV图像格式间转换。

首先定义两个image_transport::Publisher对象,设置它们的话题和缓冲区长度。接着设置发送方的发布频率为15fps(即每秒15帧)。下面在while循环中定义两个cv::Mat对象rgb和depth接收读取的图像,深度图选-1,彩色图选1。

然后定义两个sensor_msgs::ImagePtr对象,利用cv_bridge::CvImage函数转换OpenCV图像为ROS图像,该函数的输入有三个:标准消息包的头、图像编码和OpenCV源图像,再调用toImageMsg()转换为图像消息。

最后通过发布对象publish消息,loop_rate.sleep()控制每个循环的时间相同。

	// 告诉roscore要在该话题下发布图像
    image_transport::Publisher rgb_pub = it.advertise("rgb", 15);
    image_transport::Publisher depth_pub = it.advertise("depth", 15);
    // 设置发布频率15fps(每秒15帧)
    ros::Rate loop_rate(15);
    int index = 0;
    while (nh.ok()) {
            std::cout << "正在发布第" << index << "帧rgb-d话题" << std::endl;
            if (index >= rgb_frames.size()) return 1;
            cv::Mat rgb = cv::imread(rgb_frames[index], 1);
            cv::Mat depth = cv::imread(depth_frames[index], -1);
            sensor_msgs::ImagePtr msg_rgb = cv_bridge::CvImage(std_msgs::Header(), "bgr8", rgb).toImageMsg();
            sensor_msgs::ImagePtr msg_depth = cv_bridge::CvImage(std_msgs::Header(), "mono16", depth).toImageMsg();
            // 发布消息
            rgb_pub.publish(msg_rgb);
            depth_pub.publish(msg_depth);
            // ros::spinOnce();
            // 通过睡眠度过每次循环剩下的时间
            loop_rate.sleep();
            index++;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

情欲是毒令人苦,美色犹如伤人虎,邪淫是祸不是福,悬崖勒马大丈夫。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/845604
推荐阅读
相关标签
  

闽ICP备14008679号