OpenCV中的格式转换

目录

  • 1. 前言
  • 2. 采集到播放数据流的走向
  • 3. OpenCV中的格式转换
    • 3.1 RGB
    • 3.2 YUV
      • 3.2.1 YUV420{P}
      • 3.2.2 YUV420SP
  • 4 简单应用
  • 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 RGBCOLOR_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: 图像叠加中文字体

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter安装RabbitMQ测试插件

整体流程如下:先下载AMQP插件源码,可以通过antivy在本地编译成jar包,再将jar包导入JMeter目录下,重启JMeter生效。 Apache Ant 是一个基于 Java 的构建工具。Ant 可用于自动化构建和部署 Java 应用程序,使开发人员更轻…

MYSQl基础操作命令合集与详解

MySQL入门 先来个总结 SQL语言分类 DDL(Data Definition Language) - 数据定义语言: 用于定义和管理数据库结构,包括创建、修改和删除数据库对象。 示例:CREATE, ALTER, DROP等语句。 DML(Data Manipulation Lan…

常见箱包五金ERP有哪些?箱包五金ERP哪个好用

不同的箱包五金有不同的营销渠道和经营模式,而每一个营销渠道的商品信息维护流程和方式也不尽相同。另外,箱包五金价格制定、品质检验、产品种类、物料编码、批号追踪等环节的管理也比较繁琐。 近些年数字科技也被广泛的应用于箱包五金领域,…

Module ‘app‘: platform ‘android-33‘ not found.

目录 一、报错信息 二、解决方法 一、报错信息 Module app: platform android-33 not found. 检查你的应用程序的build.gradle文件中的targetSdkVersion和compileSdkVersion是否正确设置为已安装的Android SDK版本。 确保你的Android Studio已正确安装并配置了所需的Android …

TCP为什么可靠之“拥塞控制”

拥塞控制是对网络层面的控制,主要是为了避免发送方发送过多的数据导致网络阻塞,以及出现网络阻塞时能够调整数据发送速率,达到对网络阻塞的一个控制。 拥塞窗口 拥塞窗口cwnd,是发送方维护的一个状态变量,会根据网络…

Windows 11上边两个空格导致我多熬了1个多小时

将图中的文件路径复制,然后到文件管理器里边去搜索。 发现找不到,可是明明就在这里啊。 我百思不得其解,还以为是IDEA出了问题,我只能是重新启动项目,结果还是告诉我找不到文件。 要是同一个目录下已经有一个名为a…

【设计模式--行为型--中介者模式】

设计模式--行为型--中介者模式 中介者模式定义结构案例实现优缺点使用场景 中介者模式 定义 又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立的改变它们之间的交互。 结构 抽象中介者角色…

如何培养孩子的自信心

当谈论培养孩子的自信心时,许多家长可能会感到困惑。自信心是一个孩子成长过程中非常重要的品质,它可以帮助孩子在面对挑战时更加勇敢和坚定。那么,如何培养孩子的自信心呢?以下是一些建议,希望能对您有所帮助。 鼓励孩…

git checkout进行更改分支

git clone https://gitee.com/yaleguo1/minit-learning-demo.git下载代码。 cd minit-learning-demo/进入目录里边。 ls -l看一下当前分支的内容。 git checkout geek_chapter02更改分支到geek_chapter02。 ls -l看一下目录里边的内容。

Sui第八轮资助:七个项目获得资助

今天,Sui基金会宣布本月的资助获得者,他们因构建项目以推动Sui的采用和发展而获得资助。要获得资助,项目必须提交提案,详细说明他们正在构建的内容、预算明细、关键里程碑、团队经验以及对Sui社区的预期贡献。 以下七个项目致力于…

MySQL事务与MVCC详解

前置概念之事务 在开始MVCC的讨论之前,我们必须了解一些关于事务的概念。 什么是事务 现在我们开发的一个功能需要进行操作多张表,假如我们遇到以下几种情况: 某个逻辑报错数据库连接中断某台服务器突然宕机… 这时候我们数据库执行的操作可能才到一…

【算法题】N进制减法(js)

返回结果-1 const str "2 11 1"; const str1 "8 07 1"; const str2 "16 af ff"; function solution(str) {const [n, minuend, subtrahend] str.split(" ");if (n < 2 || n > 35) return -1;else if (isValid(minuend) &am…

如何用 Cargo 管理 Rust 工程系列 丙

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/viSsCaFR2x9hZOvo1PoRqA 添加依赖项 前面已经提到过在 cargo 配置文件 Cargo.toml 中如何手动添加工程依赖项&#xff0c;cargo 同样提供了 add …

stable-diffusion-webui(AI绘画)项目实现,即遇到的问题

实现步骤&#xff1a; 为了使环境中的库版本不会乱&#xff0c;导致自己电脑原来一些项目无法运行最好使用虚拟环境 下载miniconda 在搜索中搜所miniconda找到 建立虚拟环境 conda create --name sdwebui python3.10.6 每次运行激活这个虚拟环境 conda activate sdwebui …

DVWA靶场的设置

1).在win 10系统安phpstudy2016&#xff0c;如图所示 2&#xff09;创建DVWA的靶场&#xff0c;解压DVWA-master.zip到C:\phpStudy\WWW\DWA-master 3&#xff09;配置DVWA链接数据库 右键选择记事本打开configlconfig.inc.php.dist【也可以使⽤其他编辑⼯具打开】&#xff0c;…

【Linux】Redis 数据库安装教程(Ubuntu 22.04)

前言 Redis是一个开源的内存数据库&#xff0c;它可以用作键值存储、缓存和消息代理。它支持各种数据结构&#xff0c;包括字符串、哈希、列表、集合、有序集合等。Redis通常被用于构建高性能、可扩展的应用程序&#xff0c;特别是那些需要快速访问数据和实时数据处理的应用场…

教育数字化转型 赋能家庭场景自主学习习惯养成

北京市气象台12月12日22时升级发布暴雪橙色预警信号&#xff0c;北京市教委决定自12月13日开始&#xff0c;全市中小学幼儿园采取学生临时居家学习措施。自疫情以来&#xff0c;家庭已经成为另一个学习中心&#xff0c;学校不再是教育的孤岛。 学习方式的变革&#xff0c;数字…

C++中STL的概念——零基础/小白向,适合竞赛,初学C++者使用

目录 1.STL的诞生 2. STL的基本概念 3. STL六大组件 4. STL容器&#xff0c;算法&#xff0c;迭代器 容器&#xff1a;存放数据的地方 算法&#xff1a;解决问题的方法 迭代器&#xff1a;容器和算法之间的桥梁 5. STL初始&#xff1a;打印0 ~ 9 的数字 这篇文章是一篇…

武林风云之linux组软raid0

小y可喜欢玩文明系列的游戏了&#xff0c;因为小y也一直喜欢造轮子&#xff0c;属于自己的轮子。 每次小y听到”要向雄鹰一样&#xff0c;定要遨游于天际。”感觉自己给自己打了一针强心剂&#xff0c;要求自己拼搏进取。 众所周知&#xff0c;文明是个原生的linux游戏&#xf…

大创项目推荐 深度学习 opencv python 实现中国交通标志识别_1

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…