赞
踩
需求:将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++; }
情欲是毒令人苦,美色犹如伤人虎,邪淫是祸不是福,悬崖勒马大丈夫。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。