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. Directory 类

    Directory 类 该类公开,主要用于创建.移动和枚举通过目录和子目录的静态方法.此类不能被继承.       命名空间: System.IO;       程序集: mscorlib(在 msc ...

  2. 如何使用maven进行avro序列化

    maven导入avro: <dependency> <groupId>org.apache.avro</groupId> <artifactId>avr ...

  3. 怎样把linux客户端用户禁止用 su命令来切换用户

    系统中有一个组叫做“wheel”,我们可以利用该组实现一些特殊的功能.我们可以将拥有su使用权限的用户加入到wheel组中并且对该组进行限制,那么只有在该组中的用户才有su的使用权限. 如要实现该功能 ...

  4. Nginx编译安装:

    第三方模块 在nginx.org   --------  wiki  找 --add-module=   添加 Nginx编译安装: 安装开发环境 ]# yum groupinstall " ...

  5. Python学习(二十) —— 前端之CSS

    转载自http://www.cnblogs.com/liwenzhou/p/7999532.html 一.CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTM ...

  6. echarts Y轴的刻度 跟数据对应---tooltip-formatter

    var xAxisData = ['2018-01', '2018-02', '2018-03', '2018-04', '2018-05', '2018-06', '2018-07', '2018- ...

  7. sql查询count 单独字段不同值

    1.单表查询 SELECT COUNT(CASE WHEN (字段=值列1) THEN reportstatus END) AS 已上报,COUNT(CASE WHEN (字段=值列0) THEN 字 ...

  8. 牛客练习赛 26 B题 烟花【DP】(经典)

    <题目链接> 题目描述 小a有个烟花,每个烟花代表着互不相同的颜色,对于第个烟花,它有的概率点燃,现在小a要去点燃它们,他想知道产生颜色的期望个数 及 产生恰好产生种颜色的概率 输入描述: ...

  9. 数据库相关--net start mysql 服务无法启动(win7系统)解决

    系统:win7 旗舰版 64位 MySQL:8.0.11 家里台式机上不久之前安装了MySQL,一段时间没碰过后,突然启动不了了(我有一头小毛驴,我从来也不骑,有一天我心血来潮骑它去赶集) 先是在系统 ...

  10. [OC] Delegate的使用

    建立两个页面 A 和 B,我们假设他们的文件名为ControllerA,ControllerB 由A页面,点击跳转到B页面.在B页面中,进行一些操作,并得到一个值,并将这个值传回给A页面,并在A页面上 ...