文章目录

  • 转换公式
  • 需要注意
  • 函数代码
  • 测试用例
  • 下载

本文介绍了将rgb视频图像转换为yuv420格式视频图像的方法,附有详细的代码和图像示例。文中rgb24和yuv420文件需要使用yuv/rgb播放器才能查看,参考播放器可选择雷神推荐的修改了一个YUV/RGB播放器,或者小编使用的vooya播放器。

转换公式

rgb到yuv的转换公式:

Y=0.299∗R+0.587∗G+0.114∗BY=0.299*R+0.587*G+0.114*BY=0.299∗R+0.587∗G+0.114∗B U=−0.147∗R−0.289∗G+0.463∗BU=-0.147*R-0.289*G+0.463*BU=−0.147∗R−0.289∗G+0.463∗B V=0.615∗R−0.515∗G−0.100∗BV=0.615*R-0.515*G-0.100*BV=0.615∗R−0.515∗G−0.100∗B

需要注意

1.RGB24存储方式是Packed,YUV420存储方式是planer。
2.U、V分量在水平和垂直方向上的取样数是Y分量的1/2。

函数代码

本函数实现了将rgb视频图像转换为yuv420格式视频图像,具体代码如下所示。

int CTransPic::simplest_rgb24_to_yuv420(const char* url, int w, int h, int num, const char* url_out)
{ifstream fp_rgb24;fp_rgb24.open(url, ios::in | ios::binary);ofstream fp_yuv420;fp_yuv420.open(url_out, ios::out | ios::binary);//RGB bufferunsigned char* rgb24_pic = (unsigned char*)malloc(w*h * 3);//YUV bufferunsigned char* yuv420_pic = (unsigned char*)malloc(w*h * 3 / 2);for (int i = 0; i < num; i++){fp_rgb24.read((char*)rgb24_pic, w*h * 3);RGB24_to_YUV420(rgb24_pic, w, h, yuv420_pic);fp_yuv420.write((const char*)yuv420_pic, w*h * 3 / 2);}free(rgb24_pic);free(yuv420_pic);fp_rgb24.close();fp_yuv420.close();return 0;
}

代码中的关键函数RGB24_to_YUV420(rgb24_pic, w, h, yuv420_pic)实现了rgb像素到yuv像素的转换,具体实现过程如下所示。

int CTransPic::RGB24_to_YUV420(unsigned char* rgb24_pic, int w, int h, unsigned char* yuv420_pic)
{unsigned char *YPtr, *UPtr, *VPtr, *RGBPtr;//Init YUV buffermemset(yuv420_pic, 0, w*h * 3 / 2);YPtr = yuv420_pic;UPtr = yuv420_pic + w*h;VPtr = UPtr + w*h / 4;unsigned char r, g, b, y, u, v;for (int i = 0; i < h; i++){RGBPtr = rgb24_pic + w*i * 3;for (int j = 0; j < w; j++){r = *(RGBPtr++);g = *(RGBPtr++);b = *(RGBPtr++);y = (unsigned char)((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;u = (unsigned char)((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;v = (unsigned char)((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;*(YPtr++) = clip_value(y, 0, 255);if (i % 2 == 0 && j % 2 == 0){*(UPtr++) = clip_value(u, 0, 255);}else{if (j % 2 == 0){*(VPtr++) = clip_value(v, 0, 255);}}}}return 0;
}

其中,clip_value(u, 0, 255)函数对转换后的像素进行了范围约束。

unsigned char CTransPic::clip_value(unsigned char pix, unsigned char min_val, unsigned char max_val)
{if (pix < min_val){return min_val;}else if (pix > max_val) {return max_val;}else{return pix;}
}

函数调用方法如下所示。

TranPic.simplest_rgb24_to_yuv420("4_1024x640.rgb", 1024, 640, 1, "output_yuv420_1024x640.yuv");

测试用例

程序测试用的原图如下所示:

4_1024x640.rgb

测试输出yuv420图像如下所示。

4_1024x640_rgb2yuv.yuv

下载

vooya播放器:https://download.csdn.net/download/whegqing/11519824
测试用例图:https://download.csdn.net/download/whegqing/11522107


版本声明:本文参考了雷神的文章,文中代码重新做了编写,亲测可用,欢迎转载交。
另外,测试用例图出自昵图网,如有侵权请告知。

视频图像数据处理八:将rgb视频图像转换为yuv420格式视频图像相关推荐

  1. 在Python中使用OpenCV将RGB格式的图像转换为HSV格式的图像

    An HSV is another type of color space in which H stands for Hue, S stands for Saturation and V stand ...

  2. 【音视频数据数据处理 14】【FLV篇】解析FLV视频码流,并分离FLV中的视频及MP3音频文件

    [音视频数据数据处理 14][FLV篇]解析FLV视频码流,并分离FLV中的视频及MP3音频文件 一.FLV封装原理 1.1 Tag Data 1.1.1 Audio Tag Data结构(音频Tag ...

  3. TIFF图像被转换为​​JPEG格式的图像

    TIFF图像被转换为​​JPEG格式的图像. for name in glob.glob(root_dir+img_dir+'*.tif'): im = Image.open(name) name = ...

  4. (工具ffmpeg)视频转换为flv格式,视频截取图片

    /**/ /// <summary>         /// 视频(avi,mov等等格式)转换为flv格式视频         /// </summary>          ...

  5. JavaCV音视频开发宝典:vb8和vp9编码的webm格式视频文件转成mp4文件

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 ​ 前言 mp4不用多说,我们日常生活中,手机上或者浏览器网页中使用最多的视频文件就是 ...

  6. 将qlv格式转换为mp4格式视频

    首先有腾讯视频客户端,打开腾讯客户端,点击设置,具体步骤如下图所示:     然后双击此电脑,在此电脑的搜索栏黏贴之前复制的那串路径,黏贴完成之后,按Enter键进行搜索,进入如下图所示的文件夹 ,再 ...

  7. YUV420格式视频下载

    地址连接: http://trace.eas.asu.edu/yuv/index.html http://media.xiph.org/

  8. MATLAB读取一张RGB图片转成YUV420格式、YUV422格式、YUV444格式

    转:https://www.cnblogs.com/hythink/p/5421720.html 1.读入照片 控制输出的标志定义 1 2 3 4 5 6 7 8 9 10 11 clc;close  ...

  9. TensorFlow:实战Google深度学习框架(六)图像数据处理

    第七章 图像数据处理 7.1 TFRecord输入数据格式 TensorFlow提供了一种统一的格式来存储数据--TFRecord格式 7.1.1 TFRecord格式介绍 7.1.2 TFRecor ...

最新文章

  1. 领扣(LeetCode)最长公共前缀 个人题解
  2. redis集群部署一直卡在Waiting for the cluster to join ......
  3. display(block,inline,none),visibility(visible,hidden)之间的关系及区别(不同)
  4. 柠檬班python自动化视频百度云_python自动化装逼指南1-装饰器详解
  5. Java进阶之对象克隆(复制)
  6. Hadoop 倒排索引
  7. centos 修改开机画面
  8. 携程否认竞价排名;戴尔为“吃鸡外挂”致歉;腾讯将发区块链游戏 | CSDN极客头条
  9. BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)
  10. 搜索引擎只能抓取html文件,为什么有些明明存在的网页不能被搜索到?
  11. Tomcat运行时报内存溢出
  12. vfp 中调用硬盘_硬盘你真的选对了么?固态真的好用么?细数硬盘这些年出现的坑!...
  13. logit回归模型的参数估计过程_LOGISTIC模型参数估计及预测实例.pdf
  14. 【STM32f401学习之路-02】USART串口通信
  15. P2P网络与BitTorrent技术简介
  16. 艾肯声卡安装调试方法【必看】
  17. java基础学习备忘录
  18. 【渝粤教育】国家开放大学2018年秋季 0088-21T保险学概论 参考试题
  19. 爬虫学习:实现对彼岸图4k图片的下载
  20. 逐帧绘制毕达哥拉斯树

热门文章

  1. oracle minus 条件,Oracle minus用法详解及应用实例
  2. 银河5 号超级计算机,超级计算器前五名:中国“霸占”第一和第二【图】
  3. 产品体验报告:百度贴吧
  4. 计算机知识竞赛拉赞助,知识竞赛活动方案策划书
  5. 如何在office2016(word2016)中安装mathtype6.9及相关问题解决方案
  6. go语言的类型之间的相互转化和float保留小数时的四舍五入
  7. python画玫瑰曲线_turtle画玫瑰花,表白必备
  8. C++: 函数重载(c++函数原型、函数重载要素)
  9. Qt音视频开发12-mpv解码播放
  10. 第一代商用计算机是由,计算机基础辅导资料