论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# 之 Structure 和 Class的区别
一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...
- 【AtCoder】ARC073
ARC 073 C - Sentou 直接线段覆盖即可 #include <bits/stdc++.h> #define fi first #define se second #defin ...
- ionic2/cordova自定义插件集成aar包
一.准备自定义插件 1. 准备:安装plugman npm install -g plugman 2. 新建组件 plugman create --name MyPlugin --plugin_id ...
- es6 promise对象
function next(){ return new Promise( function( resolve, reject ){ var num =7 // Math.floor( Math.ran ...
- Python 扫盲
yield使用浅析 菜鸟教程:http://www.runoob.com/w3cnote/python-yield-used-analysis.html #!/usr/bin/python # -*- ...
- Spring日记_02之 json、javaBean、.do、MySql、MyBatis 环境搭建结束
JSON Json是JavaScript直接量语法 无参构造方法直接 Alt + \ 就可以提示添加 Project – Clean 浏览器向服务器发送请求,服务器中的Spring中的SpringMV ...
- day 54 jQuery, part-1
上节内容回顾: 1. 前情回顾 1. DOM对象和BOM对象 1. BOM 对象 --> window location location.href location.href="ht ...
- exporter API(导出、输出器api)moodel3.3
Moodle[导出器]是接收数据并将其序列化为一个简单的预定义结构的类.它们确保输出的数据格式统一,易于维护.它们也用于生成外部函数的签名(参数和返回值) 外部函数定义在moodle/lib/exte ...
- Gym 102091K The Stream of Corning 2【线段树】
<题目链接> 题目大意: 进行两种操作:1.给定一个数的出现时间.价值.消失时间: 2.进行一次询问,问你当前时间,第K大的数的价值. 解题分析: 采用离线集中处理,将每个数的出现时间和它 ...
- Vue自学
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.Vue是框架而jQuery则是库. 1.2.AMD与CM ...