初学音视频(一)-RGB和YUV格式分析
来源:互联网 发布:python作用 编辑:程序博客网 时间:2024/05/30 22:55
前言
- 有幸能够看到雷霄骅先生的博客,很感谢雷神能够这么无私把知识分享出来,对我这种新手的帮助实在是太大了。希望到另一个世界雷神不用再这么辛苦的。
- 本篇文章基本全是参考雷神的:视音频数据处理入门:RGB、YUV像素数据处理
- 学完这篇文章,任务本篇文章的核心就是YUV和RGB这种颜色编码在内存中是如何存储的,像BMP(或者JPG)封装格格式到底是什么东西的。
- 本篇文章是在C语言的基础上写的,因为我是做android的,最近才学了一点C语言基础的,刚好派上用场了。
- 需要的YUV,RGB等格式的查看工具:雷神分享了 这些工具和源文件 。在这些工具中一个叫:yuvplayer.exe的程序是可以查看YUV格式的内容的
实际操作
1.分离YUV420P像素数据中的Y、U、V分量
- 代码如下:
int main1(void){ //打开一个文件 只读权限 FILE *fp=fopen("/home/huangyu/HYtestYUV/lena_256x256_yuv420p.yuv","rb+"); int a= access("/home/huangyu/HYtestYUV/lena_256x256_yuv420p.yuv",0); printf("a=%d",a); // 文件是否存在 if( a != 0 ){ printf("%s","the file isnot exit"); } FILE *fp1=fopen("/home/huangyu/HYtestYUV/graybar_640x360y.y","wb+"); FILE *fp2=fopen("/home/huangyu/HYtestYUV/graybar_640x360u.y","wb+"); FILE *fp3=fopen("/home/huangyu/HYtestYUV/graybar_640x360v.y","wb+"); int w=256; int h=256; //申请一个yuv420大小的内存空间 unsigned char *pic=(unsigned char *)malloc(w*h*3/2); int num = 1; int i = 0 ; for (i = 0 ; i <num ; i++){ //将fp文件的内容读取到pic内存中 fread(pic , 1 , w*h*3/2 ,fp); //Y data //将pic内容一个字节一个字节写入fp1 fwrite(pic , 1 , w*h , fp1); //U data fwrite(pic + w * h , 1 , w * h / 4 ,fp2); //V data fwrite(pic + w * h * 5 / 4 , 1 , w * h / 4 , fp3); } printf("%s","end work"); free( pic ); fclose ( fp ); fclose ( fp1 ); fclose ( fp2 ); fclose ( fp3 ); return 0;}
- 这个小点要了解YUV在内存中的存放方式,这个本身这个图片是420P的图片,420P的图片是4个Y对应一对UV,那么内存大小就是 宽度 * 高度(YYYY) + 宽度 * 高度/2(UV),这是数据量,在内存中的储存方式是YYYYYYYY….UU.VV.,这个的….是指前 宽 * 高 的byte中存储的全是YYYY的信息,然后才有UUUUUUUU…,把U存储完后才会存储VVVVVVV… 。
总结不下去了 简单的把重点的知识勾勒一下,明天继续
分离YUV420P像素数据中的Y、U、V分量和分离YUV444P像素数据中的Y、U、V分量这两个分割中
- 要了解420P和444P在内存中的存储方式,这个P代表了Planar这种存储方式,仔细看:http://blog.csdn.net/tkp2014/article/details/42110885。像素的采样位数一律为8bit这个概念还没弄清楚
- 软件查看YUV Y这种后缀文件的时候要转换格式和固定分辨率
- 这里注意 YUV在内存中的存储格式和YUV本身的排列格式是两个概念。
将YUV420P像素数据去掉颜色(变成灰度图) 、将YUV420P像素数据的亮度减半
- 这里要注意 为什么设置unsigned char *p来定义 把-128-127 转换成0-255 这样容易减半
- 这里注意数据对 颜色 和亮度的影响是如何造成的
将YUV420P像素数据的周围加上边框
加深对YUV420P这种存储方式的理解,可以用方形框框来描述这种存储方式的
生成YUV420P格式的灰阶测试图
一个算法而已
计算两个YUV420P像素数据的PSNR
- PSNR的概念,注意计算的方式就OK
- 我的取值一个是26 左右的, 还有我用U还是V的数据 进行比较的时候 数据是36
分离RGB24像素数据中的R、G、B分量
- 弄清楚RGB24这种图像在内存中的存储方式的
将RGB24格式像素数据封装为BMP图像
- bmp分装的格式 两个头里面都包括什么东西,目前还没有测试成功
将RGB24格式像素数据转换为YUV420P格式像素数据
- 这种转换的格式要记住
- 核心:
- 从源代码可以看出,本程序实现了RGB到YUV的转换公式:
Y= 0.299*R+0.587*G+0.114*B
U=-0.147*R-0.289*G+0.463*B
V= 0.615*R-0.515*G-0.100*B
要注意的地方
1) RGB24存储方式是Packed,YUV420P存储方式是Plander。
2) U,V在水平和垂直方向的取样数是Y的一半
生成RGB24格式的彩条(算法注意一下)
0 0
- 初学音视频(一)-RGB和YUV格式分析
- 常见的RGB和YUV格式分析
- 常见的RGB和YUV格式分析
- YUV与RGB格式转换(一)
- Android拍摄视频流的格式转换(YUV --- RGB)
- android 视频流的格式转换(YUV-RGB)
- 从零开始学习音视频编程技术(十四) RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- 视频与图像RGB/YUV格式详解
- Property '0' not found on type java.lang.String的解决方案
- Hive 学习笔记
- 寒假10:Representative Sampling (30_points)
- Android:使用PopupWindow.update( )碰到的坑
- poj1018 Communication System dp
- 初学音视频(一)-RGB和YUV格式分析
- Codeforces 755C 【并查集】【思维】
- 博为峰Java技术文章 ——JavaSE Swing GridLayout布局管理器II
- 1008. Elevator
- Java 多线程设置线程超时时间之 Callable接口和Future接口
- XML
- 小项目-Java开发简单的计算器
- 【服务器】简单的C++服务器
- 【USACO】【贪心】Sorting a Three-Valued Sequence