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.

说了这么多,是时候贴上具体代码.

  1. <span style="font-size:14px;">#include <stdio.h>
  2. #include <string.h>
  3. #define     READ_WRITE_FILE_SIZE    176*144*2  //YUV422 图像分辨率为177x144
  4. unsigned char filebuf[38017] = {0};
  5. int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
  6. {
  7. int ynum=width*height;
  8. int i,j,k=0;
  9. //得到Y分量
  10. for(i=0;i<ynum;i++){
  11. yuv420[i]=yuv422[i*2];
  12. }
  13. //得到U分量
  14. for(i=0;i<height;i++){
  15. if((i%2)!=0)continue;
  16. for(j=0;j<(width/2);j++){
  17. if((4*j+1)>(2*width))break;
  18. yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
  19. }
  20. k++;
  21. }
  22. k=0;
  23. //得到V分量
  24. for(i=0;i<height;i++){
  25. if((i%2)==0)continue;
  26. for(j=0;j<(width/2);j++){
  27. if((4*j+3)>(2*width))break;
  28. yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
  29. }
  30. k++;
  31. }
  32. return 1;
  33. }
  34. int main(void)
  35. {
  36. int len = 0;
  37. FILE *fpr, *fpw;
  38. unsigned char buf[READ_WRITE_FILE_SIZE];
  39. fpr = fopen( "WEBCAM-00012.YUV", "rb" );
  40. fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
  41. if( fpr == NULL || fpw == NULL )
  42. {
  43. printf("can not read or write file\n");
  44. fcloseall();
  45. return 1;
  46. }
  47. fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
  48. if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
  49. printf("size:%d",sizeof(filebuf));
  50. fwrite( &filebuf, sizeof(filebuf), 1, fpw );
  51. fcloseall();
  52. return 0;
  53. }
  54. </span>
  1. <span style="font-size:14px;">#include <stdio.h>
  2. #include <string.h>
  3. #define     READ_WRITE_FILE_SIZE    176*144*2  //YUV422 图像分辨率为177x144
  4. unsigned char filebuf[38017] = {0};
  5. int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
  6. {
  7. int ynum=width*height;
  8. int i,j,k=0;
  9. //得到Y分量
  10. for(i=0;i<ynum;i++){
  11. yuv420[i]=yuv422[i*2];
  12. }
  13. //得到U分量
  14. for(i=0;i<height;i++){
  15. if((i%2)!=0)continue;
  16. for(j=0;j<(width/2);j++){
  17. if((4*j+1)>(2*width))break;
  18. yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
  19. }
  20. k++;
  21. }
  22. k=0;
  23. //得到V分量
  24. for(i=0;i<height;i++){
  25. if((i%2)==0)continue;
  26. for(j=0;j<(width/2);j++){
  27. if((4*j+3)>(2*width))break;
  28. yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
  29. }
  30. k++;
  31. }
  32. return 1;
  33. }
  34. int main(void)
  35. {
  36. int len = 0;
  37. FILE *fpr, *fpw;
  38. unsigned char buf[READ_WRITE_FILE_SIZE];
  39. fpr = fopen( "WEBCAM-00012.YUV", "rb" );
  40. fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
  41. if( fpr == NULL || fpw == NULL )
  42. {
  43. printf("can not read or write file\n");
  44. fcloseall();
  45. return 1;
  46. }
  47. fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
  48. if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
  49. printf("size:%d",sizeof(filebuf));
  50. fwrite( &filebuf, sizeof(filebuf), 1, fpw );
  51. fcloseall();
  52. return 0;
  53. }

论YUV422(YUYV)与YUV420相互转换的更多相关文章

  1. YUV到RGB的转换

    以下内容来源于网络,下面三个链接里的内容是比较好的,感谢博主的分享. http://blog.csdn.net/housisong/article/details/1859084 http://blo ...

  2. 第2季:从官方例程深度学习海思SDK及API

    2.1.官方mppsample的总体分析2.1.sample的整体架构(1)sample其实是很多个例程,所以有很多个main(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析 ...

  3. 【总结】关于YUV-RGB格式转换的一些个人理解

    这段时间一直在研究YUV的格式问题例如YUV422.YUV420,在网上搜索了很多这方面的资料,发现很多资料讲的东西是重复的,没有比较深入的讲解,所以看了之后印象不是很深,过了一段时间之后又对它们有了 ...

  4. 嵌入式开发之davinci---DM8168 8127 8148 HDVPSS中的一些英文缩写解释

    BLEND:Alpha blends input with the graphics.将输入的视频与图形做Alpha融合. CPROC:Color Processing.颜色处理.如动态对比度增强.饱 ...

  5. 想换4K显示器了?那你搞懂啥是4K了吗?

    前言 我们在科技资讯以及电脑显示器.数字电视等电子产品的宣传语中,经常能够看见4K的字样.最近,B站(哔哩哔哩)升级了HTML5播放器和视频云等相关服务,为广大用户提供了超高清(UHD: Ultra ...

  6. 音视频编解码: YUV采样格式中的YUV444,YUV422,YUV420理解

    YUV各种采样格式的说明 通常我们用RGB表示一种彩色.计算机系统里的LCD显示的数据就是RGB来表示每个像素的颜色.而在我们生活里,有黑白电视机与彩色电视机两种,拍摄节目源时不可以用两种不同的摄像机 ...

  7. YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)

    背景: 最近在研究音视频,了解YUV这样的格式对于音视频开发比较重要. 虽然这篇文章大部分是转载别人的,但是经过了校对以后,重新排版并补充了一部分内容   概览: 之所以提出yuv格式的原因,是为了解 ...

  8. 图像原始格式(YUV444 YUV422 YUV420)一探究竟

    前段时间搞x264编码测试,传参的时候需要告诉编码器我的原始数据格式是什么,其中在x264.h头文件中定义了如下一堆类型. /* Colorspace type */ #define X264_CSP ...

  9. yuv422/yuv420格式

    关于YUV格式 转载:http://www.cnblogs.com/soniclq/archive/2012/02/02/2335974.html YUV 格式通常有两大类:打包(packed)格式和 ...

随机推荐

  1. ps命令显示uid而不是用户名的解决方法

  2. namenode做了ha后kylin出现错误No registered coprocessor service found for name CubeVisitService in region

    错误如下: Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.excep ...

  3. Python操纵Excel,数据库

    操作excelxlwt:写入excel表格 ,用这个之前需要先导入模块 xlwt: import xlwtxlrd:读取excel,用这个之前需要先导入模块 xlwt:import xlrd 注意:e ...

  4. ECMAScript 原始类型

    ---恢复内容开始--- ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String. 1.typeof ...

  5. Petya and Array CodeForces - 1042D (树状数组)

    D. Petya and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. HDU 6119 小小粉丝度度熊 (区间去重)【尺取】

    <题目链接> 度度熊决定每天都在星星小姐的贴吧里面签到. 但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到. 不过度度熊并不是非常悲伤,因为他有m张补 ...

  7. Linux学习之RPM包管理-rpm命令管理(十六)

    Linux学习之RPM包管理-rpm命令管理 目录 简介 RPM包依赖性 包全名与包名 rpm软件包安装 rpm软件包卸载 升级降级rpm软件包 rpm软件包的查询 rpm软件包校验 简介 RPM是R ...

  8. Python常用模块--configparser

    作用: 官方:实现基本配置语言的类,该语言提供类似于Microsoft Windows INI文件中的结构.您可以使用它来编写可由最终用户轻松定制的Python程序. 通俗的说:该模块用于系统配置文件 ...

  9. 66. 二叉树的前序遍历.md

    描述 给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]. Binary Tree Pr ...

  10. VMware5.5-添加数据中心,集群及主机

    首先介绍下硬盘的三种设置格式,这个要搞清楚 虚机硬盘的三种格式 厚置备延迟置零 厚置备,分配10g空间,虚拟机没开机时就分配了: 延迟置零,没开机之前只分配空间,里面的数据不抹零,当开机写入数据时再抹 ...