OpenCV中的格式转换

目录

  • [1. 前言](#1. 前言)
  • [2. 采集到播放数据流的走向](#2. 采集到播放数据流的走向)
  • [3. OpenCV中的格式转换](#3. OpenCV中的格式转换)
    • [3.1 RGB](#3.1 RGB)
    • [3.2 YUV](#3.2 YUV)
      • [3.2.1 YUV420{P}](#3.2.1 YUV420{P})
      • [3.2.2 YUV420SP](#3.2.2 YUV420SP)
  • [4 简单应用](#4 简单应用)
  • [5. 关联文章](#5. 关联文章)

1. 前言

实际音视频开发过程芯片是做了硬件加速的,主要涉及到视频编解码。二次开发过程中需要对SDK做一定的封装使用才行。

写这篇文章的目的和硬编解码无关。 只是如无硬件转换接口的情况下如何对原始数据的转换,以便后续查看。


2. 采集到播放数据流的走向

  • 采集(IN)
    • 这里说的采集方式是摄像头的采集, 排除另外从流地址或视频文件的方式。
    • 采集一般通过USB接口或MIPI接口, 如果追求图像质量的要求,建议走MIPI, 如果追求的后期处理,快速开发, 走USB。
  • ISP
    • 如果是走的USB摄像头, 只能简单的通过V4L2的系统调用设置, 涉及到曝光,白平衡,亮度,锐度,饱和度,gamma等参数的设置。
    • 如果采集模块是MIPI, Soc芯片SDK支持ISP的图像增强3A,这个优化会更好。
  • 原始数据复用
    • 简单说数据分到多通道,每个通道赋予的业务需求不一样, 可能一个通道的数据给算法做人脸识别,另外一个通道数据作为抓拍, 第三通道做缩放, 第四通道做推流等,
    • 不同的通道可以对数据做不同的图像增强和处理。
  • 编码
    • 编译目的为了减少数据量,增大传输效率和存储效率
    • 编码一般采用H264/H265比较多
  • 解码
    • 对编码数据做解码,得到原始数据, 方便数据在显示器上渲染
  • 播放(OUT)
    • 一般为显示器

3. OpenCV中的格式转换

因为考虑实际原始数据用的比较多的是BGR/YUV之类的,通过枚举ColorConversionCodes 可以发现设计这个枚举的思想。
因为有时候我们不知道要转的是yuv420sp还是yuv420p,而且不同的地方叫法都有差异,这是写这篇的重点。


3.1 RGB

比较简单, 不在叙述。

3.2 YUV

  • 这里只写YUV420的部分,YUV422,YUV444的部分类似。

  • 先看OpenCV中定义的,不得不佩服啥都考虑了, 不多不少,刚刚好。

  • 可以看到涉及到YUV的多种形态,包含NV21,NV12, YUV420sp; YV12, IYUV, I420,容易混淆。

  • 一般而言,YUV420P通常为YV12,OpenCV头文件imgproc.hpp中COLOR_YUV420p2BGR = COLOR_YUV2BGR_YV12,

    //! YUV 4:2:0 family to RGB
    COLOR_YUV2RGB_NV12 = 90,
    COLOR_YUV2BGR_NV12 = 91,
    COLOR_YUV2RGB_NV21 = 92,
    COLOR_YUV2BGR_NV21 = 93,
    COLOR_YUV420sp2RGB = COLOR_YUV2RGB_NV21,
    COLOR_YUV420sp2BGR = COLOR_YUV2BGR_NV21,

      COLOR_YUV2RGBA_NV12 = 94,
      COLOR_YUV2BGRA_NV12 = 95,
      COLOR_YUV2RGBA_NV21 = 96,
      COLOR_YUV2BGRA_NV21 = 97,
      COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21,
      COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21,
    
      COLOR_YUV2RGB_YV12  = 98,
      COLOR_YUV2BGR_YV12  = 99,
      COLOR_YUV2RGB_IYUV  = 100,
      COLOR_YUV2BGR_IYUV  = 101,
      COLOR_YUV2RGB_I420  = COLOR_YUV2RGB_IYUV,
      COLOR_YUV2BGR_I420  = COLOR_YUV2BGR_IYUV,
      COLOR_YUV420p2RGB   = COLOR_YUV2RGB_YV12,
      COLOR_YUV420p2BGR   = COLOR_YUV2BGR_YV12,
    
      COLOR_YUV2RGBA_YV12 = 102,
      COLOR_YUV2BGRA_YV12 = 103,
      COLOR_YUV2RGBA_IYUV = 104,
      COLOR_YUV2BGRA_IYUV = 105,
      COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV,
      COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV,
      COLOR_YUV420p2RGBA  = COLOR_YUV2RGBA_YV12,
      COLOR_YUV420p2BGRA  = COLOR_YUV2BGRA_YV12,
    
      COLOR_YUV2GRAY_420  = 106,
      COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420,
      COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420,
      COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420,
      COLOR_YUV2GRAY_IYUV = COLOR_YUV2GRAY_420,
      COLOR_YUV2GRAY_I420 = COLOR_YUV2GRAY_420,
      COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420,
      COLOR_YUV420p2GRAY  = COLOR_YUV2GRAY_420,
    

3.2.1 YUV420{P}

YUV420P一般称plane平面模式,Y,U,V分别在三个不同平面,它是YUV标准格式,分为YU12和YV12
注意看,OpenCV中没有给出YU12,而使用COLOR_YUV2BGR_I420{android中常用叫法}和 COLOR_YUV2BGR_IYUV 对应

总结: YUV420即为YU12(I420/IYUV), YUV420P即YV12

3.2.2 YUV420SP

YUV420SP格式的图像阵列,首先是所有Y值,然后是UV或者VU交替存储,NV12和NV21属于YUV420SP格式,是一种two-plane模式,即Y和UV分为两个plane,但是UV(CbCr)为交错存储,而不是分为三个平面。

4 简单应用

  • YUV420转BGR

      	cv::Mat image_src(1080*3/2, 1920, CV_8UC1, char *pyuv420_data);
      	cv::Mat image_dst;
      	cv::cvtColor(image_src, image_dst, cv::COLOR_YUV2BGR_I420);
    
  • BGR转YUV420

      	cv::cvtColor(image_dst, image_src,  cv::COLOR_BGR2YUV_IYUV);
    

5. 关联文章

连接1: 图像叠加中文字体

相关推荐
泰迪智能科技014 分钟前
高校企业数据挖掘平台推荐
人工智能·数据挖掘
劳工小朋友34 分钟前
为什么神经网络的可解释性差?
人工智能·深度学习·神经网络
炸膛坦客36 分钟前
神经网络入门实战:(一)神经网络解决的两种问题,以及AI、机器学习、深度学习三者之间的逻辑关系
人工智能·深度学习·机器学习
CoderIsArt38 分钟前
基于 RBF 神经网络整定的 PID 控制
人工智能·深度学习·神经网络
ZStack开发者社区40 分钟前
云轴科技ZStack亮相2024 IDC中国生态峰会,共塑AI时代IT生态新格局
人工智能·科技
Guofu_Liao41 分钟前
大语言模型---ReLU函数的计算过程及其函数介绍
人工智能·语言模型·自然语言处理
码蜂窝编程官方1 小时前
【含开题报告+文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
java·vue.js·人工智能·后端·spring·数据挖掘·maven
遗落凡尘的萤火-生信小白1 小时前
转录组数据挖掘(生物技能树)(第11节)下游分析
人工智能·数据挖掘
XinZong2 小时前
【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!
人工智能
没有余地 EliasJie2 小时前
深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录
人工智能·嵌入式硬件·深度学习