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. C# 之 判断一个字符是否是汉字

    判断一个字符是不是汉字通常有三种方法: [1] 用 ASCII 码判断:[2] 用汉字的 UNICODE 编码范围判断:[3] 用正则表达式判断. 1.用ASCII码判断 在 ASCII码表中,英文的 ...

  2. Windows系统下MySQL添加到系统服务方法(mysql解压版)

    MySQL软件版本:64位 5.7.12 1.首先配置MySQL的环境变量,在系统环境变量Path的开头添加MySQL的bin目录的路径,以“;”结束,我的路径配置如下: 2.修改MySQL根目录下的 ...

  3. net core体系-API-1Ocelot-(3)简单项目实战

    首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具 ...

  4. HDU4622 Reincarnation 字符串 SAM

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU4622.html 题目传送门 - HDU4622 题意 多组数据. 对于每一组数据,给定一个字符串 s , ...

  5. Validation failed for object='employee'. Error count: 1问题解决

    2018-11-13 在表单提交时有时候会提示 Validation failed for object=’user’. Error count: 1,其中user是表的名字,Error count是 ...

  6. ESP8266进阶篇

    ESP8266进阶篇 20170225(应需要,继续使用此模块!!!) 说一下如何通过内网和外网来控制我的ESP8266的数据模块 1.内网控制:(要求手机直接连接在ESP8266的WIFI上面,使用 ...

  7. 在web项目中搭建一个spring mvc + spring + mybatis的环境

    介绍:本文中示范搭建一个ssm环境的框架:使用流程就是客户端通过http请求访问指定的接口,然后由服务器接受到请求处理完成后将结果返回. 本项目请求流程细节介绍:由客户端请求到指定的接口,这个接口是个 ...

  8. SpringMVC(三十) 实例:SpringMVC_RESTRUL_CRUD_显示所有员工信息

    Step by step to create a springMVC demo. 1. 创建一个dynamic web 工程. 2. 添加需要的jar文件,如下图: 3. 配置web.xml:配置di ...

  9. 安装mysql以及修改mysql字符集问题

    1.安装mysql sudo apt-get install mysql-server sudo apt-get install mysql-client   2.部分命令: sudo service ...

  10. C#-常用知识点

    1.日期相关 获取英文月份名称 : DateTime.Now.ToString("MMMM") 1.1 各个字母所代表的意思 1.MM:月份 2.mm:分钟 3. MMMM:文字形 ...