sensor_msgs/CompressedImage消息类型转换成sensor_msgs/Image消息类型

sensor_msgs/CompressedImage消息类型转换成sensor_msgs/Image消息类型

Python实现的代码

可以将sensor_msgs/CompressedImage消息类型转换成sensor_msgs/Image消息类型:

import rospy
from sensor_msgs.msg import CompressedImage, Image
from cv_bridge import CvBridge, CvBridgeError

bridge = CvBridge()

def compressed_image_callback(msg):
    try:
        cv_image = bridge.compressed_imgmsg_to_cv2(msg)
    except CvBridgeError as e:
        rospy.logerr("CvBridgeError: %s", e)
        return

    try:
        image_msg = bridge.cv2_to_imgmsg(cv_image, encoding="bgr8")
    except CvBridgeError as e:
        rospy.logerr("CvBridgeError: %s", e)
        return

    image_msg.header = msg.header

    pub.publish(image_msg)

if __name__ == '__main__':
    rospy.init_node("compressed_to_image")
    sub = rospy.Subscriber("compressed_image", CompressedImage, compressed_image_callback, queue_size=1)
    pub = rospy.Publisher("image", Image, queue_size=1)
    rospy.spin()

在这个代码中,我们首先导入了必要的ROS消息类型和cv_bridge库。然后,我们定义了一个名为“bridge”的CvBridge实例,它允许我们将ROS消息转换为OpenCV图像。接下来,我们定义了一个名为“compressed_image_callback”的回调函数,它将接收到的压缩图像消息转换为OpenCV图像,并使用cv_bridge将其转换为sensor_msgs/Image消息类型。最后,我们发布转换后的图像消息。在main()函数中,我们创建了一个名为“compressed_to_image”的ROS节点,并订阅名为“compressed_image”的压缩图像消息。我们还创建了一个名为“image”的发布者,用于发布转换后的图像消息。最后,我们通过调用rospy.spin()来使节点保持活动状态。

C++实现的代码

可以将sensor_msgs/CompressedImage消息类型转换成sensor_msgs/Image消息类型:

#include <ros/ros.h>
#include <sensor_msgs/CompressedImage.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>

void compressedImageCallback(const sensor_msgs::CompressedImageConstPtr& msg)
{
    
    
    cv_bridge::CvImagePtr cv_ptr;
    try
    {
    
    
        cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
    }
    catch (cv_bridge::Exception& e)
    {
    
    
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }

    sensor_msgs::ImagePtr image_msg = cv_ptr->toImageMsg();
    image_msg->header = msg->header;

    pub.publish(image_msg);
}

int main(int argc, char** argv)
{
    
    
    ros::init(argc, argv, "compressed_to_image");
    ros::NodeHandle nh;

    ros::Subscriber sub = nh.subscribe("compressed_image", 1, compressedImageCallback);
    pub = nh.advertise<sensor_msgs::Image>("image", 1);

    ros::spin();

    return 0;
}

在这个代码中,我们首先包含必要的ROS消息类型和cv_bridge库。然后,我们定义了一个名为“compressedImageCallback”的回调函数,它将接收到的压缩图像消息转换为OpenCV图像,并使用cv_bridge将其转换为sensor_msgs/Image消息类型。最后,我们发布转换后的图像消息。在main()函数中,我们创建了一个名为“compressed_to_image”的ROS节点,并订阅名为“compressed_image”的压缩图像消息。我们还创建了一个名为“image”的发布者,用于发布转换后的图像消息。最后,我们通过调用ros::spin()来使节点保持活动状态。

猜你喜欢

转载自blog.csdn.net/gezongbo/article/details/130166776