图像存储格式标准完整梳理

分为两大体系:RGB/RGBA(打包格式)YUV 系列(Planar / 打包 / 半平面),重点结合你地平线 RDK、bgr2nv12、FCOS 模型场景讲解。

基础术语

  • 打包 (Packed)同一个像素多通道连续存放 R G B R G B
  • 平面 (Planar):所有通道分开整块存放 RRRR...GGGG...BBBB...
  • 半平面 (Semi-Planar):亮度单独一块,色度交织存放(NV12/NV21)
  • 采样格式 YUV444 / YUV422 / YUV420:色度分辨率压缩比例

一、RGB 系列标准(OpenCV 常用)

像素顺序:单像素通道排列

1. BGR8 Packed(OpenCV 默认)

  • 布局:B G R | B G R | ...
  • 维度:HWC (Height, Width, Channel)
  • 位深:每通道 8bit uint8
  • 来源:USB 摄像头读到的 frame、日常图像处理

代码中 frame = cap.read() 获取的就是这个格式。

2. RGB8 Packed

布局:R G B R G B ... PIL/Pytorch 默认,和 OpenCV 通道顺序相反

3. BGRA / RGBA

增加 Alpha 透明通道,B G R A / R G B A

⚠️ 重点区分:通道顺序 ≠ 存储排布 RGBBGR,直接送入模型推理会颜色全部错乱。

二、YUV 基础概念

  • Y:亮度(Luma);U/V:色度(Chroma)
  • YUV420:2×2 像素块共用一组 U、V,色度宽高均减半;总字节 = H×W×1.5
  • YUV422:横向 2 像素共享一组 UV;总字节 = H×W×2
  • YUV444:无压缩,每个像素独立 UV;总字节 = H×W×3

三、YUV420 三大主流标准(重中之重,对应代码)

1. I420 (YUV420 Planar)

三平面格式

plaintext

[全部Y]
[全部U]
[全部V]

排布:YYYYYYYY UUUU VVVV

  • Y:H×W
  • U:H×W/4
  • V:H×W/4 ✅ 你代码 cv2.COLOR_BGR2YUV_I420 输出就是它

2. NV12 (YUV420 Semi-Planar 半平面)

地平线模型 `fcos_512x512_nv12.bin强制输入格式

plaintext

[全部Y]
[U0 V0 U1 V1 U2 V2 ...]
  • Y 单独一块
  • UV 交织存放(U 后跟 V)

这就是 bgr2nv12_opencv 最终生成格式

3. NV21 (YUV420 Semi-Planar)

安卓摄像头原生输出最多!

plaintext

[全部Y]
[V0 U0 V1 U1 V2 U2 ...]

UV 顺序:V U V U…… ❌ NV12 ≠ NV21,混用直接画面偏绿 / 偏紫

I420 / NV12 / NV21 直观对比

plaintext

I420: YYYYYY UUUU VVVV
NV12: YYYYYY UVUVUVUV
NV21: YYYYYY VUVUVUVU

四、其他常见 YUV 标准(拓展)

YUV422

  1. YUYV(Packed): Y0 U0 Y1 V0 Y2 U1 Y3 V1
  2. UYVY(Packed): U0 Y0 V0 Y1 U1 Y2 V1 Y3

YUV444P

三平面:[Y][U][V],色度不压缩。

五、内存排布分类总表

表格

类型 代表格式 存储特征
Packed 打包 BGR8、RGB8、YUYV 像素连续,通道交织
Planar 全平面 I420,YUV444P 各通道独立整块
Semi-Planar 半平面 NV12、NV21 Y 单独平面,UV 交织

六、分辨率硬性约束(YUV420 强制规则)

NV12 / I420 / NV21 宽、高必须是偶数 原理:色度以 2×2 像素块采样; 如果 H/W 为奇数,UV 平面边界错位 → 图像马赛克、花屏。

七、结合你地平线 RDK 工程场景总结

  1. OpenCV 采集 USB 摄像头 → BGR8 Packed(HWC)
  2. cv2 转成 I420 (三平面)
  3. 代码手动重组 UV 通道 → NV12(半平面)一维 buffer
  4. dnn.forward(nv12_data) 送入 BPU 推理

为什么模型选用 NV12? MIPI 摄像头原生输出 NV12;省去色彩空间转换,BPU 硬件原生加速 NV12 输入,减少 CPU 开销。

八、极易踩坑对照表

  1. BGR ≠ RGB → 颜色颠倒
  2. NV12 ≠ NV21 → UV 顺序颠倒(偏色)
  3. I420 ≠ NV12 → 布局不同,直接送入模型完全失效
  4. YUV420 图像宽高奇数 → UV 采样越界,画面碎裂

九、补充:Tensor 维度格式(深度学习额外标准)

  1. NCHW:Batch/Channel/Height/Width(地平线 BPU 默认)
  2. NHWC:Batch/Height/Width/Channel(TensorFlow) ⚠️ 区分:图像内存存储格式 ≠ 神经网络 Tensor 排布格式,二者是两个独立概念!
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐