sensor_msgs::Image消息及其参数

很多的博客直接将原网址复制粘贴过来,这里做一个整理,另外原网址是:https://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/Image.html
该消息意味包含未压缩的图像,且(0,0)在图像的左上角。
参数大体含义如下:

  • header:设定header,1.时间戳是图像获取的时间。2.frame_id是相机的光学帧3.帧的原点是光学相机的中心4.+x为图像向右5.+y为图像向下6.+z为指向图像平面
  • uint32 height:图片高度,即行数
  • uint32 width:图片宽度,即列数
  • string encodeing:像素编码(通道含义、排序、大小)
  • uint8 is_bigendian:数据是否是双端
  • uint32 step:全行长度(字节)
  • uint8[] data:实际矩阵数据

首先拿VINS-Mono的代码举例:

 sensor_msgs::Image img;
        //下面是定义消息参数 
        img.header = img_msg->header;
        //图像高度,行数  
        img.height = img_msg->height;
        //图像宽度,列数 	
        img.width = img_msg->width;	
        //数据是否是双端 	
        img.is_bigendian = img_msg->is_bigendian;
        //全行长度 
        img.step = img_msg->step;	
        //实际矩阵数据 	
        img.data = img_msg->data;			
        //改变编码方式
        img.encoding = "mono8";		
### 使用 `sensor_msgs::Image` 数据类型的说明 #### 什么是 `sensor_msgs::Image` 在 ROS 中,`sensor_msgs::Image` 是一种标准的消息类型,用于表示图像数据。它通常被用来传输摄像头或其他传感器捕获的原始图像帧[^1]。 该消息结构定义如下: | 字段名 | 类型 | 描述 | |----------------|---------------------|----------------------------------------------------------------------| | header | std_msgs/Header | 时间戳和坐标系信息 | | height | uint32 | 图像的高度(像素数) | | width | uint32 | 图像的宽度(像素数) | | encoding | string | 像素编码格式 (如 `"rgb8"`, `"bgr8"`, `"mono8"` 等) | | is_bigendian | uint8 | 是否采用大端字节序 | | step | uint32 | 行间距(每行占用的字节数),通常是 `width * bytes_per_pixel` | | data | uint8[] | 实际存储的图像数据数组 | --- #### 如何发布和订阅 `sensor_msgs::Image` ##### 发布 `sensor_msgs::Image` 要发布一个 `sensor_msgs::Image` 消息,可以按照以下方式实现: ```cpp #include <ros/ros.h> #include <sensor_msgs/Image.h> int main(int argc, char **argv){ ros::init(argc, argv, "image_publisher"); ros::NodeHandle nh; // 创建 publisher 对象 ros::Publisher pub = nh.advertise<sensor_msgs::Image>("camera/image_raw", 1); // 初始化图像消息对象 sensor_msgs::Image img_msg; img_msg.header.stamp = ros::Time::now(); img_msg.height = 480; // 设置高度 img_msg.width = 640; // 设置宽度 img_msg.encoding = "rgb8"; // 设置编码格式 img_msg.is_bigendian = false; // 小端模式 img_msg.step = 640 * 3; // 计算步幅 img_msg.data.resize(480 * 640 * 3); // 预分配内存空间 // 循环发送图像消息 while (ros::ok()){ // 更新时间戳 img_msg.header.stamp = ros::Time::now(); // 填充图像数据(此处仅为示例) for(size_t i=0;i<img_msg.data.size();i++) { img_msg.data[i] = rand() % 256; // 随机填充颜色值 } // 发送消息 pub.publish(img_msg); ros::spinOnce(); ros::Duration(0.1).sleep(); // 控制频率 } } ``` 上述代码展示了如何创建并发布一条带有随机噪声的 RGB 图像流。 --- ##### 订阅 `sensor_msgs::Image` 订阅 `sensor_msgs::Image` 的方法可以通过回调函数来处理接收到的数据: ```cpp #include <ros/ros.h> #include <sensor_msgs/Image.h> void imageCallback(const sensor_msgs::ImageConstPtr& msg){ ROS_INFO("Received an image with size [%d x %d]", msg->height, msg->width); } int main(int argc, char **argv){ ros::init(argc, argv, "image_subscriber"); ros::NodeHandle nh; // 创建 subscriber 对象 ros::Subscriber sub = nh.subscribe("/camera/image_raw", 1, imageCallback); ros::spin(); return 0; } ``` 此代码片段展示了一个简单的回调函数,当有新的图像到达时会打印其尺寸信息。 --- #### 工具支持:`image_transport` 为了更高效地传输图像数据,ROS 提供了 `image_transport` 库作为扩展功能。它可以透明地切换不同的压缩算法(如 JPEG 或 THEORA 编码)。默认情况下,`image_transport` 使用的是未压缩的 raw 格式。 以下是使用 `image_transport` 进行发布的例子: ```cpp #include <ros/ros.h> #include <image_transport/image_transport.h> #include <cv_bridge/cv_bridge.h> // OpenCV 和 ROS 转换工具 #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> int main(int argc, char **argv){ ros::init(argc, argv, "image_pub_with_it"); ros::NodeHandle nh; image_transport::ImageTransport it(nh); cv::Mat frame = cv::imread("example.jpg"); // 加载一张图片 if(frame.empty()) { ROS_ERROR("Failed to load image!"); return -1; } // 创建 Publisher image_transport::Publisher pub = it.advertise("camera/image", 1); while(ros::ok()){ try{ // 使用 cv_bridge 转换 Mat 到 ImageMsg sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg(); // 发布消息 pub.publish(msg); } catch(cv_bridge::Exception &e){ ROS_ERROR("Error converting image: %s", e.what()); } ros::spinOnce(); ros::Rate loop_rate(10).sleep(); } } ``` 通过引入 `cv_bridge` 可以方便地将 OpenCV 的 `cv::Mat` 结构转换成 ROS 的 `sensor_msgs::Image` 消息。 --- #### 示例应用:网格地图迭代器演示 如果需要进一步探索基于图像的操作,还可以参考 `grid_map_demos` 包中的 `iterators_demo.launch` 文件,其中包含了关于栅格地图迭代器的具体用法[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值