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颜色空间的转换相关推荐

  1. RAW图像数据到RGB

    RAW图像数据到RGB Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 ...

  2. 第二节 MATLAB中图像数据导入、导出和转换

    图像数据的导入和导出,图像类型和类的转换 MATLAB® 中的基本数据结构体(数组)天然适合表示图像.使用工具箱函数,您可以从支持的图形文件或科学文件格式将图像数据导入工作区.反过来,您也可以将数据从 ...

  3. 如何将yuv420p图像数据转换为RGB数据并使用opencv保存为jpg图片

    yuv420是用4个byte存储4个Y的信息,用1个Byte存储U的信息,一个Byte存储V的信息, 这4个Y共用这2个U和V ,也就是用6个Byte 存储4个像素信息,也就是一个像素需要12个Bit ...

  4. OpenCV中对图像数据进行64F和8U转换的方法

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 在OpenCV中很多对数据的运算都需要转换为64 ...

  5. 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )

    文章目录 I . FFMPEG AVFrame 图像数据帧处理 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III. FFMPEG 解码前后的图像格式 IV ...

  6. RGB颜色空间转换HSV颜色空间 RGB2HSV算法

    这是最常用的RGB到HSV例程,还有一个额外的小优化(向除数添加1e-20f以避免需要将除法除以零): 讲解:--------------action---------------- 直接看这段代码很 ...

  7. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )

    文章目录 一.Bitmap 图像数据处理 二.Java 层 Bitmap 对象转为 JNI 层 bitmap 对象 三.获取 bitmap 中的图像数据 四.过滤 bitmap 中的图像数据 ( 获取 ...

  8. 【KITTI】KITTI数据集简介(三) — 图像数据image_2

    KITTI数据集种共包含了4相机数据,2个灰度相机和2个彩色相机,其中image_2存储了左侧彩色相机采集的RGB图像数据(RGB).其他图像数据本次暂时不介绍,后续算法研究如果用到再进行补充. 相机 ...

  9. 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图

    一. 使用cvCvtColor函数将RGB颜色空间转换到HSV颜色空间 所需函数: 1.cvCvtColor 函数功能:颜色空间转换 函数原型: void cvCvtColor( const CvAr ...

  10. RGB与Lab颜色空间互相转换

    RGB与Lab颜色空间互相转换 1.Lab颜色空间 同RGB颜色空间相比(见博客<光与色的故事--颜色空间浅析>),Lab是一种不常用的色彩空间.它是在1931年国际照明委员会(CIE)制 ...

最新文章

  1. red gate | sql CI
  2. 难道这又是个未解之谜?--- 关于DLL中使用ADODATASET出错的问题
  3. 【linux】spinlock 的实现
  4. python 柱状图 居中_python matplotlib模块: bar(柱状图)
  5. 从2D到3D 开发者讲述“街霸V”的美术秘笈
  6. Back button implementation in Text reuse component GSTEXT
  7. mysql数据库局限性_Mysql分区表局限性总结
  8. 【OpenCV 例程200篇】91. 高斯噪声、瑞利噪声、爱尔兰噪声
  9. 作为一个普通人的日常
  10. 安徽省第二次计算机水平考试,2006第二次安徽省计算机水平考试试卷(ACCESS).doc...
  11. webbrowser 模块的 open()方法
  12. Spring Boot学习总结(21)——SpringBoot集成Redis等缓存以注解的方式优雅实现幂等,防千万次重复提交实例代码
  13. Cocos2dx 下面,对 音乐 和音效简单封装
  14. Oracle大型数据库系统在AIX/UNIX上的实战详解
  15. AudioToolbox.framework框架学习
  16. boost线程指南手册
  17. 三菱GXWorks2 程序写入CPU/从CPU读取程序
  18. 个人收集的IT技术网站集合,涉及web前后端,大数据,UI设计等。...
  19. 【2019年05月10日】指数估值排名
  20. 腾讯云游戏多媒体解决方案

热门文章

  1. svn各版本代码比较
  2. Local Binary Patterns LBP算法
  3. 社会工程学之《反欺骗的艺术》小结(一)
  4. 遗传算法GA原理详解及实例应用 附Python代码
  5. 【NLP】10其它词、句向量生成方法——腾讯AI实验室汉字词句嵌入语料库与gensim Doc2Vec
  6. java8 32位和64位资源分享 Windows 版本:8u311
  7. 安全测试-Drozer安全测试框架实践记录篇
  8. 14款CSS3图片层叠切换动画
  9. 如何打开java jar文件怎么打开方式_Win10系统下jar文件如何打开?
  10. linux卸载wine qq,ubuntu安装wineQQ