YUV_NV21图像数据到RGB颜色空间的转换
Overview
欢迎访问 持续更新: https://cgabc.xyz/posts/267a3fd1/
本文主要介绍YUV_NV21颜色空间到RGB(BGR in OpenCV)颜色空间的转换,并给出示例代码,另附YUV图像查看工具。
NV21(YUV420)介绍
NV12和NV21属于YUV420格式(每2x2四个Y,共用一组uv),是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。先存储所有的Y,然后UV交错存储:NV12先U后V,NV21先V后U。
YUV420sp示例格式如下:
YUV_NV21转BGR代码
YUV_NV21颜色空间到RGB(BGR in OpenCV)颜色空间的转换示例代码如下:
const int width = 1280;
const int height = 800;std::ifstream file_in;
file_in.open("../image_yuv_nv21_1280_800_01.raw", std::ios::binary);
std::filebuf *p_filebuf = file_in.rdbuf();
size_t size = p_filebuf->pubseekoff(0, std::ios::end, std::ios::in);
p_filebuf->pubseekpos(0, std::ios::in);char *buf_src = new char[size];
p_filebuf->sgetn(buf_src, size);cv::Mat mat_src = cv::Mat(height*1.5, width, CV_8UC1, buf_src);
cv::Mat mat_dst = cv::Mat(height, width, CV_8UC3);cv::cvtColor(mat_src, mat_dst, cv::COLOR_YUV2BGR_NV21);
转换出的(正确)效果如下:
接下来,我自己按如下逻辑实现该算法,替换掉 OpenCV的 cv::cvtColor(mat_src, mat_dst, cv::COLOR_YUV2BGR_NV21)
- 从内存中读取出每个像素的YUV,即 YUV420 --> YUV444
- 根据 YUV --> RGB 公式,计算出RGB值
- 按 BGR888 的内存分布格式,将RGB值写入内存传给
cv::Mat
- 保存图片到本地显示
实现代码如下:
void yuv_nv21_to_rgb(unsigned char rgb[], char yuv[], int width, int height) {int total = width * height;char Y, U, V;unsigned char R, G, B;int index = 0;for (int h = 0; h < height; h++) {for (int w = 0; w < width; w++) {Y = yuv[h * width + w];if ((w & 1) == 0)V = yuv[total + (h >> 1) * width + w];if ((w & 1) == 1)U = yuv[total + (h >> 1) * width + w - 1];// OpenCV YCrCb --> RGB//B = Y + 1.773*(U-128);//G = Y - 0.714*(V-128) - 0.344*(U-128);//R = Y + 1.403*(V-128);// YUV-->RGB for HDTV(BT.601)//B = Y + 2.03211*(U-128);//G = Y - 0.39465*(U-128) - 0.5806*(V-128);//R = Y + 1.13983*(V-128);// YUV-->RGB for HDTV(BT.709)//B = Y + 2.12798*(U-128);//G = Y - 0.21482*(U-128) - 0.38059*(V-128);//R = Y + 1.28033*(V-128);// YCbCr-->RGBB = 1.164*(Y-16) + 2.018*(U-128);G = 1.164*(Y-16) - 0.813*(U-128) - 0.391*(V-128);R = 1.164*(Y-16) + 1.596*(V-128);if (R < 0) R = 0; else if (R > 255) R = 255;if (G < 0) G = 0; else if (G > 255) G = 255;if (B < 0) B = 0; else if (B > 255) B = 255;rgb[index++] = B;rgb[index++] = G;rgb[index++] = R;}}
}
该代码中试了几种 YUV --> RGB 的算法,效果最好的即上面使用(未注释)的代码,转换结果如下:
欢迎各位同学指正,找出效果不好的原因,并解决问题,谢谢~
- 在StackOverflow回答的问题:Converting YUV into BGR or RGB in OpenCV
- 整个工程可参见我的Github工程:https://github.com/cggos/cgocv/tree/master/cv_libs/opencv/image_convertor ,可在此提交 Issue
- 本代码 测试yuv raw图像 可在此下载:https://download.csdn.net/download/u011178262/10791506
YUV图像 查看工具
- RAW pixels viewer (online)
- vooya
- Datahammer 7yuv (windows)
YUV_NV21图像数据到RGB颜色空间的转换相关推荐
- RAW图像数据到RGB
RAW图像数据到RGB Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 ...
- 第二节 MATLAB中图像数据导入、导出和转换
图像数据的导入和导出,图像类型和类的转换 MATLAB® 中的基本数据结构体(数组)天然适合表示图像.使用工具箱函数,您可以从支持的图形文件或科学文件格式将图像数据导入工作区.反过来,您也可以将数据从 ...
- 如何将yuv420p图像数据转换为RGB数据并使用opencv保存为jpg图片
yuv420是用4个byte存储4个Y的信息,用1个Byte存储U的信息,一个Byte存储V的信息, 这4个Y共用这2个U和V ,也就是用6个Byte 存储4个像素信息,也就是一个像素需要12个Bit ...
- OpenCV中对图像数据进行64F和8U转换的方法
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 在OpenCV中很多对数据的运算都需要转换为64 ...
- 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
文章目录 I . FFMPEG AVFrame 图像数据帧处理 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III. FFMPEG 解码前后的图像格式 IV ...
- RGB颜色空间转换HSV颜色空间 RGB2HSV算法
这是最常用的RGB到HSV例程,还有一个额外的小优化(向除数添加1e-20f以避免需要将除法除以零): 讲解:--------------action---------------- 直接看这段代码很 ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
文章目录 一.Bitmap 图像数据处理 二.Java 层 Bitmap 对象转为 JNI 层 bitmap 对象 三.获取 bitmap 中的图像数据 四.过滤 bitmap 中的图像数据 ( 获取 ...
- 【KITTI】KITTI数据集简介(三) — 图像数据image_2
KITTI数据集种共包含了4相机数据,2个灰度相机和2个彩色相机,其中image_2存储了左侧彩色相机采集的RGB图像数据(RGB).其他图像数据本次暂时不介绍,后续算法研究如果用到再进行补充. 相机 ...
- 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图
一. 使用cvCvtColor函数将RGB颜色空间转换到HSV颜色空间 所需函数: 1.cvCvtColor 函数功能:颜色空间转换 函数原型: void cvCvtColor( const CvAr ...
- RGB与Lab颜色空间互相转换
RGB与Lab颜色空间互相转换 1.Lab颜色空间 同RGB颜色空间相比(见博客<光与色的故事--颜色空间浅析>),Lab是一种不常用的色彩空间.它是在1931年国际照明委员会(CIE)制 ...
最新文章
- red gate | sql CI
- 难道这又是个未解之谜?--- 关于DLL中使用ADODATASET出错的问题
- 【linux】spinlock 的实现
- python 柱状图 居中_python matplotlib模块: bar(柱状图)
- 从2D到3D 开发者讲述“街霸V”的美术秘笈
- Back button implementation in Text reuse component GSTEXT
- mysql数据库局限性_Mysql分区表局限性总结
- 【OpenCV 例程200篇】91. 高斯噪声、瑞利噪声、爱尔兰噪声
- 作为一个普通人的日常
- 安徽省第二次计算机水平考试,2006第二次安徽省计算机水平考试试卷(ACCESS).doc...
- webbrowser 模块的 open()方法
- Spring Boot学习总结(21)——SpringBoot集成Redis等缓存以注解的方式优雅实现幂等,防千万次重复提交实例代码
- Cocos2dx 下面,对 音乐 和音效简单封装
- Oracle大型数据库系统在AIX/UNIX上的实战详解
- AudioToolbox.framework框架学习
- boost线程指南手册
- 三菱GXWorks2 程序写入CPU/从CPU读取程序
- 个人收集的IT技术网站集合,涉及web前后端,大数据,UI设计等。...
- 【2019年05月10日】指数估值排名
- 腾讯云游戏多媒体解决方案