当前位置: 首页 > backend >正文

ros2--图像/image

原始图像

接口类型:

压缩图像

接口类型:

sensor_msgs/msg/CompressedImage

ros2 interface show sensor_msgs/msg/CompressedImage 
# This message contains a compressed image.std_msgs/Header header # Header timestamp should be acquisition time of imagebuiltin_interfaces/Time stampint32 secuint32 nanosecstring frame_id# Header frame_id should be optical frame of camera# origin of frame should be optical center of cameara# +x should point to the right in the image# +y should point down in the image# +z should point into to plane of the imagestring format                # Specifies the format of the data#   Acceptable values:#     jpeg, png, tiffuint8[] data                 # Compressed image buffer

1. header (std_msgs/Header)

消息的头部信息,包含时间戳和坐标系标识:

  • stamp (builtin_interfaces/Time)

    • sec (int32): 时间戳的秒部分

    • nanosec (uint32): 时间戳的纳秒部分

    • 作用:表示图像的采集时间(通常是相机捕获图像的时刻)。

  • frame_id (string)

    • 作用:定义图像的坐标系(通常是相机的光学坐标系)。

    • 坐标系约定

      • 原点:相机的光学中心(光心)。

      • +x:指向图像的右侧

      • +y:指向图像的下方

      • +z:指向图像平面内(即光轴方向)。


2. format (string)

指定图像的压缩格式,常见值包括:

  • "jpeg""png""tiff"(ROS 支持的压缩格式)。

  • 作用:告知解码器如何解析后续的 data 字段。


3. data (uint8[])

存储压缩后的图像数据的字节数组:

  • 编码方式:由 format 字段指定(如 JPEG、PNG 等)。

  • 特点

    • 二进制数据,直接存储压缩后的字节流。

    • 相比原始图像(sensor_msgs/Image),体积更小,适合带宽有限的场景。

关键区别:CompressedImage vs 原始 Image

  • 原始图像 (sensor_msgs/Image)

    • 包含未压缩的像素数据(如 rgb8bgr8mono8 等格式)。

    • 数据量大,占用带宽高。

  • 压缩图像 (CompressedImage)

    • 通过 format 指定压缩算法(如 JPEG/PNG),data 存储压缩后的二进制流。

    • 需解码后才能使用(如用 OpenCV 的 cv_bridge)。

图像压缩算法和像素格式

图像的本质

图像的数据本质上是 像素值的集合,存储了每个点的颜色或亮度信息。

  • 在内存中的表示

    • 图像是一个多维数组(如OpenCV中的ndarray)。

    • 例如:

      • 灰度图:shape=(H, W),每个像素是 0(黑)到 255(白)的整数(uint8)。

      • 彩色图:shape=(H, W, 3),每个像素是 [B, G, R] 三个通道的值(OpenCV默认顺序)。

  • 在文件中的表示

    • 未压缩格式(如BMP):直接存储像素值,文件较大。

    • 压缩格式(如JPEG/PNG):通过算法减少存储空间。

-- 所以先有像素,再有图像压缩算法。

图像压缩算法

作用

主要用于减少图像数据的体积,分为无损压缩有损压缩

分类

(1) 无损压缩

压缩后可以完全恢复原始数据,适合需要精确像素的场景(如医学影像、卫星图像)。

  • PNG (Portable Network Graphics)

    • 支持透明通道(Alpha通道),适合保存带遮罩的图像。

    • 压缩率较高,但比JPEG慢。

  • TIFF (Tagged Image File Format)

    • 支持多图层、多通道,常用于专业摄影和印刷。

  • BMP (位图)

    • 无压缩,文件体积大,ROS中较少使用。

(2) 有损压缩

牺牲部分图像质量以换取更高的压缩率,适合实时传输(如摄像头数据)。

  • JPEG (Joint Photographic Experts Group)

    • 最常用的有损压缩格式,适用于自然场景(照片)。

    • 不支持透明通道,压缩率高,但可能产生块状伪影(Blocking Artifacts)。

  • WebP

    • Google开发,比JPEG更高的压缩率,支持透明通道。

  • HEIF/HEIC

    • 苹果推广的高效图像格式,压缩率优于JPEG。

像素格式(Pixel Formats)

本质和作用

像素格式定义了图像数据存储方式解释规则。

注意:计算机中任何数据都是01二进制,所以图像数据也是01二进制数据。

像素格式由很多标准组成:

  1. 颜色通道(Channels)

决定图像的色彩信息如何存储,是像素格式最关键的组成部分。

  • 常见类型

通道数量格式示例说明
1mono8单通道灰度图(0=黑,255=白)
3bgr8/rgb8三通道彩色图(BGR是OpenCV默认顺序,RGB是通用标准)
4bgra8四通道(含Alpha透明通道,0=透明,255=不透明)
其他yuv422多通道非RGB格式(如YUV用于视频压缩)
  • 特殊通道排列

    • Bayer格式(如bayer_rggb):原始相机传感器的单通道排列,需解马赛克(Demosaicing)转换为RGB。


  1. 位深度(Bit Depth)

定义每个通道的数值范围和精度,影响图像的动态范围和存储大小。

位深度数据类型数值范围典型用途
8位uint80~255普通图像(JPEG/PNG)
16位uint160~65535医学影像、深度传感器
32位float32浮点数(如0.0~1.0)高动态范围(HDR)、深度图

示例

  • mono16:16位灰度图,可表示更精细的亮度层次。

  • 32FC1:32位浮点单通道,用于存储深度值(单位:米)。


  1. 数据布局(Memory Layout)

定义像素值在内存中的排列方式,影响数据读取效率。

  • 交错存储(Interleaved)

    • 通道值按像素顺序排列(如BGRBGRBGR...)。

    • 适用于大多数彩色图像(如OpenCV的bgr8)。

  • 平面存储(Planar)

    • 所有像素的同一通道连续存储(如RRRR...GGGG...BBBB...)。

    • 常见于视频编码(如YUV420)。

示例对比

  • bgr8(Interleaved):[B1,G1,R1, B2,G2,R2, ...]

  • yuv420(Planar):[Y1,Y2,...,Yn, U1,U2..., V1,V2...]


  1. 颜色空间(Color Space)

定义如何将数值映射到实际颜色,影响色彩还原效果。

颜色空间说明
RGB/BGR基于红、绿、蓝三原色的加色模型,最常用。
YUV/YCrCb分离亮度(Y)和色度(UV),用于视频压缩(如JPEG、H.264)。
HSV/HSL用色调(H)、饱和度(S)、亮度(V/L)表示,适合颜色分析。
Grayscale单通道亮度值,无色彩信息。

示例

  • 摄像头原始数据可能是YUV422,需转换为BGR才能在OpenCV中正确显示。

分类

(1) 常见彩色格式

格式名说明
rgb8红-绿-蓝,每个通道8位(24位色)
bgr8蓝-绿-红(OpenCV默认格式)
rgba8红-绿-蓝-透明(32位)
bgra8蓝-绿-红-透明(OpenCV带Alpha通道)
yuv422YUV颜色空间,用于部分摄像头
yuv420更紧凑的YUV格式(视频常用)

(2) 灰度(单通道)格式

格式名说明
mono88位灰度图(0=黑,255=白)
mono1616位灰度图(0~65535)

http://www.xdnf.cn/news/12165.html

相关文章:

  • halcon c# 自带examples报错 Matching
  • JVM中的各类引用
  • 设计模式域——软件设计模式全集
  • GIC流协议接口
  • android 之 Tombstone
  • 巴科斯-诺尔范式与抽象语法树:CMake语法实例教程
  • 深入学习RabbitMQ队列的知识
  • RabbitMQ实用技巧
  • 18650锂电池组点焊机:高效组装锂电池的关键工具|比斯特自动化
  • c++ openssl 使用 DES(数据加密标准)进行加密和解密的基本操作
  • ​减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。
  • c++算法学习4——广度搜索bfs
  • html文字红色粗体,闪烁渐变动画效果,中英文切换版本
  • 【Linux手册】冯诺依曼体系结构
  • buuctf——web刷题第二页
  • 自定义Spring Boot Starter的全面指南
  • 解决el-select选择框右侧下拉箭头遮挡文字问题
  • 自建 Derp 中继节点
  • golang 如何定义一种能够与自身类型值进行比较的Interface
  • 【论文解读】MemGPT: 迈向为操作系统的LLM
  • 13.4 AI颠覆语言学习:预录制视频+GPT-4评估如何实现60%成本降低与40%留存飙升
  • 阿里云域名怎么绑定
  • Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
  • React---day9
  • Python爬虫与Java爬虫深度对比:从原理到实战案例解析
  • 用函数实现模块化程序设计(适合考研、专升本)
  • 自定义注解facade 实现切面 进行日志记录和参数校验
  • Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案
  • 用 n8n 提取静态网页内容:从 HTTP Request 到 HTML 节点全解析
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice在线编辑word文件保存数据同时保存文件