论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)格式和 ...
 
随机推荐
- python 进阶读书笔记1 -- 理解python一切皆对象
			
理解python一切皆对象: 1.所有的类都是由type创建的 2.所有的类的基类都是object 3.type是类,也是实例,type的基类是object,type对象是由type创建的 4.obj ...
 - fillder--模拟弱网
			
##设置路径## Rules--Performemnts---Silamte Mordem Speeds 弱网原理 Rules—>Cutomize Rules打开CustomRules.js 文 ...
 - TopCoder SRM500 Div1 500 分治
			
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-500.html SRM500 Div1 500 没想到 double 的精度居然没有爆-- 考虑以 ...
 - 实体转xml 并以string输出
			
<?xml version="1.0" encoding="utf-8"?><Root> <Header> <Mess ...
 - 从零搭建 ES 搜索服务(二)基础搜索
			
一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...
 - mysql(三) 数据表的基本操作操作
			
mysql(三) 数据表的基本操作操作 创建表,曾删改查,主键,外键,基本数据类型. 1. 创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGIN ...
 - 栈 VS 队列
			
linkStack.javalinkQueue.java程序强调栈和队列是概念上的实体,独立于它们的具体实现.用数组或者是用链表实现栈都是一样的.栈的重要性在于它的push()操作和pop()操作.以 ...
 - mac安装Elasticsearch
			
去官网下载https://www.elastic.co/downloads/elasticsearch 本人使用的是2.3.2版本,我下载的是tar版本的,然后解压. 进入es的安装目录, cd el ...
 - C#Stopwatch的简单计时zz
			
Stopwatch 类 命名空间:System.Diagnostics.Stopwatch 实例化:Stopwatch getTime=new Stopwatch(); 开始计时:getTime.St ...
 - 蓝桥杯 ——无重复组合——C++
			
问题描述: 求任意长度的(ABCD.....)全部n=0,1,2 ....组合情况(n小于等于串的长度) 解决思路: 如果串的长度固定,n的值固定循环嵌套 在这里以深度优先形成一棵树,如下图: 源代码 ...