对于 YUV 所表示的图像,Y 和 UV 分量是分离的。如果只有 Y 分量而没有 UV 分离,那么图像表示的就是黑白图像。彩色电视机采用的就是 YUV 图像,解决与和黑白电视机的兼容问题,使黑白电视机也能接受彩色电视信号。

人眼对色度的敏感程度低于对亮度的敏感程度。主要原因是视网膜杆细胞多于视网膜锥细胞,其中视网膜杆细胞的作用就是识别亮度,视网膜锥细胞的作用就是识别色度。所以,眼睛对于亮度的分辨要比对颜色的分辨精细一些。

利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点。

所以,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。相比 RGB,能够节约不少存储空间。

YUV 4:4:4采样方式与 RGB 图像大小是一样的。
YUV 4:2:2相比 RGB, 节省了三分之一的存储空间。
YUV 4:2:0相比 RGB, 节省了一半的存储空间。

设实际宽高为w*h的图像,如果是RGB格式,那么他的数据量为w*h*3
如果是yuv420格式,那么他的数据量为w*h*1.5
因为yuv4:4:4的数据量等于RGB数据量,而yuv4:4:4yuv4:2:0数据量的2倍,所以yuv4:2:0的数据量为w*h*3/2

yuv420sp转化得到RGB的步骤:
  • 1.当我们拿到一帧图像的yuv原始数据后,首先需要明确拿到的是以下哪种yuv数据:yuv4:4:4yuv4:2:2yuv4:2:0。并且,我们都会知道给对应图像的宽和高,因为这都是驱动配置给出的。如果你是从yuv元素数据中截取出来的某roi区域的yuv数据,那么你也应该知道该roi的宽和高。注意,此时的宽和高是指图像的宽和高,不是指代图像数据码流排列的行数和列数。
  • 2.把原始yuv数据通过构造cv::Mat格式封装起来,此时的cv::Mat的宽(.cols)和高(.rows)就需要变化了,因为yuv格式和RGB格式的数据量是不一样的,yuv格式如果不是yuv4:4:4(yuv数据量为w*(h*3))的话,那么yuv格式的数据量是一定比RGB少的。所以,此时如果是yuv420格式,就根据yuv420格式的特点,把cv::Mat的宽高设置为w*(h*1.5),且必须为单通道,注意这里宽度不变,是在高度上延伸。yuyv原始数据变成cv::Mat格式后,你如果直接imshow显示的话,图像会变高。转化成RGB格式后才会恢复为正常宽和高。
  • 3.然后再通过cv::cvtColor(yuyv_img, rgb_img, cv::COLOR_YUV420sp2RGB);转化得到RGB图像。

注意构造yuyv的cv::Mat时通道类型是CV_8UC1,而构造RGB的cv::Mat时通道类型是CV_8UC3.

cv::Mat yuyv_img =cv::Mat(box.height * 3 / 2, box.width, CV_8UC1,const_cast<unsigned char *>(yuv_raw.data()));
if (!yuyv_img.data) {std::cout << "empty yuyv_img"<< std::endl;
}
cv::Mat rgb_img = cv::Mat(box.height, box.width, CV_8UC3);
cv::cvtColor(yuyv_img, rgb_img, cv::COLOR_YUV420sp2RGB);

可参考下面两篇文章来理解YUV:
一文理解 YUV
YUV色彩格式总结

【opencv】YUV各种色彩、YUV420sp2RGB相关推荐

  1. OpenCV YUV 与 RGB的互转(草稿)

    YUV 转 RGB cv::Mat yuvImg; /*//下面两行是我自己代码里用来构成YUV图像的数据,可以忽略 yuvImg.create(pInput->height*3/2, pInp ...

  2. opencv yuv保存本地_OpenCV-dlib-python3实现人脸戴墨镜和含Y的抖音效果

    1 说明: ===== 1.1 吸烟有害健康!!纯属娱乐和学习python的相关知识. 1.2 虽然是娱乐,但是opencv.dlib和python在人工智能.人脸识别.自动化等有很大作用,目前已经或 ...

  3. python cv2模块imshow_Python cv2.imshow方法代码示例

    本文整理汇总了Python中cv2.imshow方法的典型用法代码示例.如果您正苦于以下问题:Python cv2.imshow方法的具体用法?Python cv2.imshow怎么用?Python ...

  4. opencv 解析yuv_OpenCV Mat格式存储YUV图像

    YUV图像用的比较多,而且YUV图像的格式众多(YUV格式可以参考YUV pixel formats),如何用OpenCV的Mat类型来存储YUV图像也是经常遇到的问题. 对于YUV444图像来说,就 ...

  5. YUV格式转换RGB(基于opencv)

    在编写代码将需要处理YUV格从每个视频帧中提取,然后将其保存为图片.有两种常见的方法在线,第一种是通过opencv自带cvCvtColor,可是这样的方法有bug.得到的图片会泛白.另外一种方法是公式 ...

  6. opencv 解析yuv_通过OpenCV读取并显示YUV视频文件

    前言 Opencv中通常是读取 avi 格式的视频文件,下面程序是直接读取 YUV格式的视频文件并显示出来. 这里需要将YUV读取出来,使用Mat格式保存再使用 cv::cvtColor() 将每帧的 ...

  7. yuv转opencv中的IplImage

    http://www.2cto.com/kf/201208/145559.html http://www.opencv.org.cn/forum.php?mod=viewthread&tid= ...

  8. Opencv中BGR、YUV、YUV_I420\NV12分析

    文章目录 一.CV_BGR2YUV 二.CV_BGR2YUV_I420 三.I420和NV12的区别以及Opencv中相互转换 四.I420或者NV12转RGB 五.补上demo测试 本地模拟视频解码 ...

  9. opencv 读取NV12格式(.yuv)文件,并转为RGB格式保存为JPG

    实测代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <op ...

最新文章

  1. java 应用连接oracle 超级慢的解决方法
  2. php时间区间,优化显示
  3. 终于!《iOS 全埋点解决方案》正式出版
  4. 今夜,我们一起缅怀对美好事物痴迷的青葱岁月
  5. php memcache 64,PHP 5.3.13 memcache win 64 配置和安装
  6. 字符串大小写字母转换c 语言,towlower()
  7. python基础知识资料包-Python基础知识总结——史上最全系列
  8. 微服务跨数据库联合查询_MySQL数据库联合查询
  9. 习题3.3 线性表元素的区间删除 (20 分)
  10. [转载]Java多线程——创建线程池的几个核心构造参数
  11. 4个macOS上隐藏的小技巧
  12. rs232接口_USB转RS232接口9针串口线,工控数据转接线驱动安装方法
  13. 安卓中将Java文件转换成Dex文件
  14. 如何提高技术团队的工作效率
  15. ttest求pvalue_.net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)
  16. 微信公众号(获取token 按钮生成 推送消息,微信授权)
  17. android Settings之辅助功能
  18. python学习 -女神或者男神把微信消息撤回后好慌,有了这个妈妈再也不担心你看不到女神或者男神撤回的消息了(超详解)...
  19. 【转】BAT机器学习面试1000题系列(1~50)
  20. 数据库与身份认证:MySQL的基本使用

热门文章

  1. Spark:一个高效的分布式计算系统--转
  2. linux定时任务之crontab
  3. 必读 | 六月份不容错过的十大重磅好文,机器学习和数据科学的小伙伴拿走不谢 原创 2017-07-10 爱收藏的 AI科技大本营 作者 | Flavian Hautbois 翻译 | AI科技大
  4. 百度计算广告学沙龙学习笔记 - 内容匹配广告
  5. html5 progress css,CSS content: attr() on HTML5 progress doesn't work
  6. mysql 多表联查的效率_Mysql 多表联合查询效率分析
  7. 算法与数据结构(冒泡排序)
  8. SpringBoot - 构建监控体系03_使用 Admin Server 管理 Spring 应用程序
  9. jvm性能调优 - 07线上应用部署JVM实战_栈内存与永久代预估与设置
  10. 我的世界java手机版下载1.15_我的世界java版20w16a