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. mysql分组(五)

    MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT ...

  2. 如何自动设置网页中meta节点keywords属性-【SEO】

    在处理网页的SEO时,经常需要设置meta节点中keywords的属性. 如果是UGC产生内容的话,对于这个字段可以由用户或编辑手工设置相关的标签或关键词来进行. 但对于MGC(机器产生内容)的内容的 ...

  3. Codeforces 513E2 Subarray Cuts dp (看题解)

    我们肯定要一大一小间隔开来所以 把式子拆出来就是类似这样的形式 s1 - 2 * s2 + 2 * s3 + ...... + sn 然后把状态开成四个, 分别表示在顶部, 在底部, 在顶部到底部的中 ...

  4. maven启动tomcat访问报404(url中没有项目名)

    [INFO] Running war on http://localhost:8080/js_001(红色部分是项目名,要是没有的话是不能访问项目资源的) 但是我仍然不知道为什么有些maven项目却有 ...

  5. JavaWeb 之Ubuntu intelliJ 新建maven项目及配置tomcat

    一. 破解安装 intelliJ 下载网址:https://www.jetbrains.com/idea/ 破解激活:https://www.cnblogs.com/tanrong/p/7309343 ...

  6. day6 note 字典的增删改查(以及setdefault用法补充)

    今天的内容主要是join的用法和字典的用法,由于已经有前面的列表作为基础,所以还比较简单,不过因为昨天的作业比较难也比较多,所以作业的讲解占用的时间比较长.我需要好好消化一下作业的部分. 思维导图: ...

  7. 基于netty的websocket例子

    nettyServer package com.atguigu.netty.websocket; import javax.annotation.PostConstruct; import org.s ...

  8. 数据结构之二叉搜索树、AVL自平衡树

    前言 最近在帮公司校招~~ 所以来整理一些数据结构方面的知识,这些知识呢,光看一遍理解还是很浅的,看过跟动手做过一遍的同学还是很容易分辨的哟~ 一直觉得数据结构跟算法,就好比金庸小说里的<九阳神 ...

  9. js异步梳理:1.从浏览器的多进程到JS的单线程,理解JS运行机制

    大家很早就知道JS是一门单线程的语言.但是也时不时的会看到进程这个词.首先简单区分下线程和进程的概念 1. 简单理解进程 - 进程是一个工厂,工厂有它的独立资源 - 工厂之间相互独立 - 线程是工厂中 ...

  10. MD5_Util工具类代码

    package com.yby.mall.utils; import java.math.BigInteger; import java.security.MessageDigest; public ...