![[具身智能-563]:图像存储的格式标准](http://pic.xiahunao.cn/yaotu/[具身智能-563]:图像存储的格式标准)
图像存储格式标准完整梳理分为两大体系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 PackedOpenCV 默认布局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⚠️ 重点区分通道顺序 ≠ 存储排布RGB≠BGR直接送入模型推理会颜色全部错乱。二、YUV 基础概念Y亮度LumaU/V色度ChromaYUV4202×2 像素块共用一组 U、V色度宽高均减半总字节 H×W×1.5YUV422横向 2 像素共享一组 UV总字节 H×W×2YUV444无压缩每个像素独立 UV总字节 H×W×3三、YUV420 三大主流标准重中之重对应代码1. I420 (YUV420 Planar)三平面格式plaintext[全部Y] [全部U] [全部V]排布YYYYYYYY UUUU VVVVYH×WUH×W/4VH×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 直观对比plaintextI420: YYYYYY UUUU VVVV NV12: YYYYYY UVUVUVUV NV21: YYYYYY VUVUVUVU四、其他常见 YUV 标准拓展YUV422YUYV(Packed):Y0 U0 Y1 V0 Y2 U1 Y3 V1UYVY(Packed):U0 Y0 V0 Y1 U1 Y2 V1 Y3YUV444P三平面[Y][U][V]色度不压缩。五、内存排布分类总表表格类型代表格式存储特征Packed 打包BGR8、RGB8、YUYV像素连续通道交织Planar 全平面I420,YUV444P各通道独立整块Semi-Planar 半平面NV12、NV21Y 单独平面UV 交织六、分辨率硬性约束YUV420 强制规则NV12 / I420 / NV21宽、高必须是偶数原理色度以 2×2 像素块采样 如果 H/W 为奇数UV 平面边界错位 → 图像马赛克、花屏。七、结合你地平线 RDK 工程场景总结OpenCV 采集 USB 摄像头 →BGR8 Packed(HWC)cv2 转成I420 (三平面)代码手动重组 UV 通道 →NV12半平面一维 bufferdnn.forward(nv12_data)送入 BPU 推理为什么模型选用 NV12 MIPI 摄像头原生输出 NV12省去色彩空间转换BPU 硬件原生加速 NV12 输入减少 CPU 开销。八、极易踩坑对照表BGR ≠ RGB → 颜色颠倒NV12 ≠ NV21 → UV 顺序颠倒偏色I420 ≠ NV12 → 布局不同直接送入模型完全失效YUV420 图像宽高奇数 → UV 采样越界画面碎裂九、补充Tensor 维度格式深度学习额外标准NCHWBatch/Channel/Height/Width地平线 BPU 默认NHWCBatch/Height/Width/ChannelTensorFlow ⚠️ 区分图像内存存储格式 ≠ 神经网络 Tensor 排布格式二者是两个独立概念