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++;
    }

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用ROS中的cv_bridge库来实现ROS图像消息与OpenCV图像之间的转换。 以下是将ROS图像消息转换OpenCV图像的示例代码: ```python import cv2 import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError bridge = CvBridge() def img_callback(msg): try: cv_image = bridge.imgmsg_to_cv2(msg, "bgr8") except CvBridgeError as e: rospy.logerr(e) # 在这里进行一些对OpenCV图像的更改 cv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY) try: ros_image = bridge.cv2_to_imgmsg(cv_image, "mono8") except CvBridgeError as e: rospy.logerr(e) # 发布更改后的ROS图像消息 pub.publish(ros_image) rospy.init_node("image_converter") # 订阅原始ROS图像消息 sub = rospy.Subscriber("/camera/image_raw", Image, img_callback) # 发布更改后的ROS图像消息 pub = rospy.Publisher("/camera/image_processed", Image, queue_size=10) rospy.spin() ``` 在示例代码中,我们首先使用`imgmsg_to_cv2()`函数将ROS图像消息转换OpenCV图像。然后,我们在这里对OpenCV图像进行了一些更改,例如将彩色图像转换为灰度图像。然后,我们使用`cv2_to_imgmsg()`函数将更改后的OpenCV图像转换ROS图像消息,并将其发布到`/camera/image_processed`主题上。 请注意,我们在使用`imgmsg_to_cv2()`和`cv2_to_imgmsg()`函数时需要指定图像编码。在本例中,我们将原始ROS图像消息编码为`bgr8`,将更改后的OpenCV图像编码为`mono8`,这两种编码都适用于8位灰度或彩色图像。 最后,我们使用`rospy.spin()`来保持节点处于运行状态,以便继续接收和发布图像消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

振华OPPO

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值