论YUV422(YUYV)与YUV420相互转换
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.
说了这么多,是时候贴上具体代码.
- <span style="font-size:14px;">#include <stdio.h>
- #include <string.h>
- #define READ_WRITE_FILE_SIZE 176*144*2 //YUV422 图像分辨率为177x144
- unsigned char filebuf[38017] = {0};
- int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
- {
- int ynum=width*height;
- int i,j,k=0;
- //得到Y分量
- for(i=0;i<ynum;i++){
- yuv420[i]=yuv422[i*2];
- }
- //得到U分量
- for(i=0;i<height;i++){
- if((i%2)!=0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+1)>(2*width))break;
- yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
- }
- k++;
- }
- k=0;
- //得到V分量
- for(i=0;i<height;i++){
- if((i%2)==0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+3)>(2*width))break;
- yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
- }
- k++;
- }
- return 1;
- }
- int main(void)
- {
- int len = 0;
- FILE *fpr, *fpw;
- unsigned char buf[READ_WRITE_FILE_SIZE];
- fpr = fopen( "WEBCAM-00012.YUV", "rb" );
- fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
- if( fpr == NULL || fpw == NULL )
- {
- printf("can not read or write file\n");
- fcloseall();
- return 1;
- }
- fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
- if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
- printf("size:%d",sizeof(filebuf));
- fwrite( &filebuf, sizeof(filebuf), 1, fpw );
- fcloseall();
- return 0;
- }
- </span>
- <span style="font-size:14px;">#include <stdio.h>
- #include <string.h>
- #define READ_WRITE_FILE_SIZE 176*144*2 //YUV422 图像分辨率为177x144
- unsigned char filebuf[38017] = {0};
- int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
- {
- int ynum=width*height;
- int i,j,k=0;
- //得到Y分量
- for(i=0;i<ynum;i++){
- yuv420[i]=yuv422[i*2];
- }
- //得到U分量
- for(i=0;i<height;i++){
- if((i%2)!=0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+1)>(2*width))break;
- yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
- }
- k++;
- }
- k=0;
- //得到V分量
- for(i=0;i<height;i++){
- if((i%2)==0)continue;
- for(j=0;j<(width/2);j++){
- if((4*j+3)>(2*width))break;
- yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
- }
- k++;
- }
- return 1;
- }
- int main(void)
- {
- int len = 0;
- FILE *fpr, *fpw;
- unsigned char buf[READ_WRITE_FILE_SIZE];
- fpr = fopen( "WEBCAM-00012.YUV", "rb" );
- fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
- if( fpr == NULL || fpw == NULL )
- {
- printf("can not read or write file\n");
- fcloseall();
- return 1;
- }
- fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
- if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
- printf("size:%d",sizeof(filebuf));
- fwrite( &filebuf, sizeof(filebuf), 1, fpw );
- fcloseall();
- return 0;
- }
论YUV422(YUYV)与YUV420相互转换的更多相关文章
- YUV到RGB的转换
以下内容来源于网络,下面三个链接里的内容是比较好的,感谢博主的分享. http://blog.csdn.net/housisong/article/details/1859084 http://blo ...
- 第2季:从官方例程深度学习海思SDK及API
2.1.官方mppsample的总体分析2.1.sample的整体架构(1)sample其实是很多个例程,所以有很多个main(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析 ...
- 【总结】关于YUV-RGB格式转换的一些个人理解
这段时间一直在研究YUV的格式问题例如YUV422.YUV420,在网上搜索了很多这方面的资料,发现很多资料讲的东西是重复的,没有比较深入的讲解,所以看了之后印象不是很深,过了一段时间之后又对它们有了 ...
- 嵌入式开发之davinci---DM8168 8127 8148 HDVPSS中的一些英文缩写解释
BLEND:Alpha blends input with the graphics.将输入的视频与图形做Alpha融合. CPROC:Color Processing.颜色处理.如动态对比度增强.饱 ...
- 想换4K显示器了?那你搞懂啥是4K了吗?
前言 我们在科技资讯以及电脑显示器.数字电视等电子产品的宣传语中,经常能够看见4K的字样.最近,B站(哔哩哔哩)升级了HTML5播放器和视频云等相关服务,为广大用户提供了超高清(UHD: Ultra ...
- 音视频编解码: YUV采样格式中的YUV444,YUV422,YUV420理解
YUV各种采样格式的说明 通常我们用RGB表示一种彩色.计算机系统里的LCD显示的数据就是RGB来表示每个像素的颜色.而在我们生活里,有黑白电视机与彩色电视机两种,拍摄节目源时不可以用两种不同的摄像机 ...
- YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
背景: 最近在研究音视频,了解YUV这样的格式对于音视频开发比较重要. 虽然这篇文章大部分是转载别人的,但是经过了校对以后,重新排版并补充了一部分内容 概览: 之所以提出yuv格式的原因,是为了解 ...
- 图像原始格式(YUV444 YUV422 YUV420)一探究竟
前段时间搞x264编码测试,传参的时候需要告诉编码器我的原始数据格式是什么,其中在x264.h头文件中定义了如下一堆类型. /* Colorspace type */ #define X264_CSP ...
- yuv422/yuv420格式
关于YUV格式 转载:http://www.cnblogs.com/soniclq/archive/2012/02/02/2335974.html YUV 格式通常有两大类:打包(packed)格式和 ...
随机推荐
- C# 之设计原则
代码也需要有秩序,就像世界需要秩序,基于SOLID architecture principles. 一.SOLID原则 S.O.L.I.D.是一组面对面向对象设计的最佳实践的设计原则.术语来自Rob ...
- flink-SQL
Table API和SQL捆绑在flink-table Maven工件中.必须将以下依赖项添加到你的项目才能使用Table API和SQL: <dependency> <groupI ...
- Flink--3种分区方式
partitionByHash //TODO partitionByHash val data = new mutable.MutableList[(Int, Long, String)] data. ...
- glusterfs分布式复制扩容卷以及平衡卷
随着数据量的增长,需要扩容满足使用.今天测试下glusterfs磁盘扩容的具体步骤 1.扩容 之前用的2台计算机的分布式复制卷.需要同时之两个服务器增加一块磁盘并格式化,挂载并扩容 热添加磁盘 ech ...
- java日志的相关配置文件知识
w2bc.com/article/261758”“”“
- POJ 2112 Optimal Milking (二分+最短路+最大流)
<题目链接> 题目大意: 有K台挤奶机和C头奶牛,都被视为物体,这K+C个物体之间存在路径.给出一个 (K+C)x(K+C) 的矩阵A,A[i][j]表示物体i和物体j之间的距离,有些物体 ...
- [ 低危 ] mt网CRLF
漏洞: xxx.meituan.com/%0d%0aevilheadername:%20inject_by_whoamisb 原理猜测: 收到xxx二级域名的时候,会location跳转到该域名(这是 ...
- 大数据技术 - MapReduce的Shuffle及调优
本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要 ...
- Linux开源监控平台归总
Linux开源监控平台归总 Cacti 偏向于基础监控.成图非常漂亮,需要php环境支持,并且需要mysql作为数据存储 Cacti是一个性能广泛的图表和趋势分析工具,可以用来跟踪并几乎可以绘制出任何 ...
- jarvis OJ WEB题目writeup
0x00前言 发现一个很好的ctf平台,题目感觉很有趣,学习了一波并记录一下 https://www.jarvisoj.com 0x01 Port51 题目要求是用51端口去访问该网页,注意下,要用具 ...