论YUV422(YUYV)与YUV420相互转换
Example 2.13. V4L2_PIX_FMT_YUYV 4 × 4 pixelimage
start + 0: |
Y'00 |
Cb00 |
Y'01 |
Cr00 |
Y'02 |
Cb01 |
Y'03 |
Cr01 |
start + 8: |
Y'10 |
Cb10 |
Y'11 |
Cr10 |
Y'12 |
Cb11 |
Y'13 |
Cr11 |
start + 16: |
Y'20 |
Cb20 |
Y'21 |
Cr20 |
Y'22 |
Cb21 |
Y'23 |
Cr21 |
start + 24: |
Y'30 |
Cb30 |
Y'31 |
Cr30 |
Y'32 |
Cb31 |
Y'33 |
Cr31 |
YUV422码流存放位置
(转自http://www.chineselinuxuniversity.net/kerneldocs/media/V4L2-PIX-FMT-YUYV.html)
Example 2.18. V4L2_PIX_FMT_YUV420 4 × 4 pixelimage
start + 0: |
Y'00 |
Y'01 |
Y'02 |
Y'03 |
start + 4: |
Y'10 |
Y'11 |
Y'12 |
Y'13 |
start + 8: |
Y'20 |
Y'21 |
Y'22 |
Y'23 |
start + 12: |
Y'30 |
Y'31 |
Y'32 |
Y'33 |
start + 16: |
Cb00 |
Cb01 |
||
start + 18: |
Cb10 |
Cb11 |
||
start + 20: |
Cr00 |
Cr01 |
||
start + 22: |
Cr10 |
Cr11 |
||
YUV420码流存放位置
(转自http://www.chineselinuxuniversity.net/kerneldocs/media/re18.html该处是YVU420)
这里要顺带提一下YUV444,既无损YUV色彩空间.一个Y带一个Cb一个Cr,即YCbCr.
YUV422采样即从YUV444基础上,从第一个Y开始只保留Cb,剔去Cr,第二个Y只保留Cr剔去Cb…...这样交替采样,长度大小为width*height*2,Y:U:V=4:2:2,一个色彩分量占一个字节.
而YUV420即从YUV422基础上进行隔行采样,例如第一行只保留Cb,第二行只保留Cr……这样交替进行,Y:U:V=4:2:0并不是没有V分量,也可以是Y:U:V=4:0:2.相信这样大家容易理解.最后在这个基础上,把Y,U,V三种分量打包排列,即如上图,长度大小为width*height*3/2.
说了这么多,是时候贴上具体代码.
- <span style="font-size:14px;">#include <stdio.h>
- #include <string.h>
- #define READ_WRITE_FILE_SIZE 176*144*2 //YUV422 图像分辨率为177x144
- unsigned char filebuf[38017] = {0};
- int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
- {
- int ynum=width*height;
- int i,j,k=0;
- //得到Y分量
- for(i=0;i<ynum;i++){
- yuv420[i]=yuv422[i*2];
- }
- //得到U分量
- for(i=0;i<height;i++){
- if((i%2)!=0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+1)>(2*width))break;
- yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
- }
- k++;
- }
- k=0;
- //得到V分量
- for(i=0;i<height;i++){
- if((i%2)==0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+3)>(2*width))break;
- yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
- }
- k++;
- }
- return 1;
- }
- int main(void)
- {
- int len = 0;
- FILE *fpr, *fpw;
- unsigned char buf[READ_WRITE_FILE_SIZE];
- fpr = fopen( "WEBCAM-00012.YUV", "rb" );
- fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
- if( fpr == NULL || fpw == NULL )
- {
- printf("can not read or write file\n");
- fcloseall();
- return 1;
- }
- fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
- if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
- printf("size:%d",sizeof(filebuf));
- fwrite( &filebuf, sizeof(filebuf), 1, fpw );
- fcloseall();
- return 0;
- }
- </span>
- <span style="font-size:14px;">#include <stdio.h>
- #include <string.h>
- #define READ_WRITE_FILE_SIZE 176*144*2 //YUV422 图像分辨率为177x144
- unsigned char filebuf[38017] = {0};
- int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
- {
- int ynum=width*height;
- int i,j,k=0;
- //得到Y分量
- for(i=0;i<ynum;i++){
- yuv420[i]=yuv422[i*2];
- }
- //得到U分量
- for(i=0;i<height;i++){
- if((i%2)!=0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+1)>(2*width))break;
- yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
- }
- k++;
- }
- k=0;
- //得到V分量
- for(i=0;i<height;i++){
- if((i%2)==0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+3)>(2*width))break;
- yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
- }
- k++;
- }
- return 1;
- }
- int main(void)
- {
- int len = 0;
- FILE *fpr, *fpw;
- unsigned char buf[READ_WRITE_FILE_SIZE];
- fpr = fopen( "WEBCAM-00012.YUV", "rb" );
- fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
- if( fpr == NULL || fpw == NULL )
- {
- printf("can not read or write file\n");
- fcloseall();
- return 1;
- }
- fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
- if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
- printf("size:%d",sizeof(filebuf));
- fwrite( &filebuf, sizeof(filebuf), 1, fpw );
- fcloseall();
- return 0;
- }
论YUV422(YUYV)与YUV420相互转换的更多相关文章
- YUV到RGB的转换
以下内容来源于网络,下面三个链接里的内容是比较好的,感谢博主的分享. http://blog.csdn.net/housisong/article/details/1859084 http://blo ...
- 第2季:从官方例程深度学习海思SDK及API
2.1.官方mppsample的总体分析2.1.sample的整体架构(1)sample其实是很多个例程,所以有很多个main(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析 ...
- 【总结】关于YUV-RGB格式转换的一些个人理解
这段时间一直在研究YUV的格式问题例如YUV422.YUV420,在网上搜索了很多这方面的资料,发现很多资料讲的东西是重复的,没有比较深入的讲解,所以看了之后印象不是很深,过了一段时间之后又对它们有了 ...
- 嵌入式开发之davinci---DM8168 8127 8148 HDVPSS中的一些英文缩写解释
BLEND:Alpha blends input with the graphics.将输入的视频与图形做Alpha融合. CPROC:Color Processing.颜色处理.如动态对比度增强.饱 ...
- 想换4K显示器了?那你搞懂啥是4K了吗?
前言 我们在科技资讯以及电脑显示器.数字电视等电子产品的宣传语中,经常能够看见4K的字样.最近,B站(哔哩哔哩)升级了HTML5播放器和视频云等相关服务,为广大用户提供了超高清(UHD: Ultra ...
- 音视频编解码: YUV采样格式中的YUV444,YUV422,YUV420理解
YUV各种采样格式的说明 通常我们用RGB表示一种彩色.计算机系统里的LCD显示的数据就是RGB来表示每个像素的颜色.而在我们生活里,有黑白电视机与彩色电视机两种,拍摄节目源时不可以用两种不同的摄像机 ...
- YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
背景: 最近在研究音视频,了解YUV这样的格式对于音视频开发比较重要. 虽然这篇文章大部分是转载别人的,但是经过了校对以后,重新排版并补充了一部分内容 概览: 之所以提出yuv格式的原因,是为了解 ...
- 图像原始格式(YUV444 YUV422 YUV420)一探究竟
前段时间搞x264编码测试,传参的时候需要告诉编码器我的原始数据格式是什么,其中在x264.h头文件中定义了如下一堆类型. /* Colorspace type */ #define X264_CSP ...
- yuv422/yuv420格式
关于YUV格式 转载:http://www.cnblogs.com/soniclq/archive/2012/02/02/2335974.html YUV 格式通常有两大类:打包(packed)格式和 ...
随机推荐
- libssl.so.10: cannot open shared object file: No such file or directory
今天在使用yum安装东西的时候报错 yum list There was a problem importing one of the Python modulesrequired to run yu ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- pyqt5界面使用
安装配置了pyuic和pyrcc后再进行下面操作 1.打开: 位置(我的):C:\Users\AppData\Roaming\Python\Python35\site-packages\p ...
- Python学习(十二) —— 面向对象
一.初识面向对象 面向过程的核心是过程,流水线思维,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大地降低了写程序的复杂度,只需要顺着要执行的 ...
- ELK 环境搭建2-Kibana
一.安装前准备 1.节点 192.168.30.41 2.操作系统: Centos7.5 3.安装包 a.java8: jdk-8u181-linux-x64.tar.gz b.Kibana kiba ...
- Linux centos7安装python3并且不影响python2
一.安装依赖 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel opens ...
- xml方式将dataset导出excel
using System;using System.Collections;using System.Collections.Generic;using System.Data;using Syste ...
- Calendar抽象类的使用
Calendar timeNow = Calendar.getInstance(); int year = timeNow.get(Calendar.YEAR); // 这里月是从0开始的,即0到11 ...
- IDEA控制台问题:java lang OutOfMemoryError:PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域. OutOfMemoryError: PermGen space从表面上看就是内存溢出, ...
- >maven-compiler-plugin的理解
在maven中项目中这个插件一直都会看见,但是一直没有认真学习一下为啥使用,现在有空就查询学习一下. 1.使用场景 下载了一些工程需要编译的时候. maven是个项目管理工具,如果我们不告诉它我们的代 ...