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

需求:将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++;
    }

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

你可能感兴趣的:(ROS,opencv,人工智能,计算机视觉,ros,机器人,话题通信)