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. python全栈开发day99-DRF序列化组件

    1.解释器组件源码分析 https://www.processon.com/view/link/5ba0a8e7e4b0534c9be0c968 2.基于CBV的接口设计 1).django循环que ...

  2. Python学习(五) —— 文件操作

    一.文件操作 1.文件操作:数据持久化的一种      步骤:找到文件,打开文件,操作:读.写.追写,关闭文件      打开文件:f = open(文件路径,操作模式,编码方式),f:文件句柄.文件 ...

  3. Codeforces 542E Playing on Graph 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF542E.html 题目传送门 - CF542E 题目传送门 - 51Nod1481 题意 有一幅无向图,它有 ...

  4. VS2017 cdkey

    Enterprise:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF ProfessionalKBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  5. Excel表列名称(给定一个正整数,返回它在 Excel 表中相对应的列名称。)

    例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB ... 示例 1: 输入: 1 输出: "A ...

  6. HDU-1170的解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1170 题意:要求输入几个案例,每个案例包含操作符(+,-,*,/),操作数(两个整数).现在要求分别输 ...

  7. selenium设置chrome和phantomjs的请求头信息

    selenium设置chrome和phantomjs的请求头信息   出于反爬虫也好-跳转到手机端页面也好都需要设置请求头,那么如何进行呢? 目录 一:selenium设置phantomjs请求头: ...

  8. java、python与留下迷点的php hash collision

    JAVA 生成java的碰撞数据比较简单 根据网上资料可知: at,bU,c6的在java中的hash值是相同的 则可以根据这三个不断做 笛卡尔积 简单明了就是做字符串拼接. 举个例子 把A当做at, ...

  9. js算法初窥07(算法复杂度)

    算法复杂度是我们来衡量一个算法执行效率的一个度量标准,算法复杂度通常主要有时间复杂度和空间复杂度两种.时间复杂度就是指算法代码在运行最终得到我们想要的结果时所消耗的时间,而空间复杂度则是指算法中用来存 ...

  10. gdb windbg and od use

    gdb aslr -- 显示/设置 gdb 的 ASLR asmsearch -- Search for ASM instructions in memory asmsearch "int ...