【opencv】YUV各种色彩、YUV420sp2RGB
对于 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:4
是yuv4:2:0
数据量的2倍,所以yuv4:2:0
的数据量为w*h*3/2
。
从yuv420sp
转化得到RGB
的步骤:
- 1.当我们拿到一帧图像的yuv原始数据后,首先需要明确拿到的是以下哪种yuv数据:
yuv4:4:4
、yuv4:2:2
、yuv4: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相关推荐
- OpenCV YUV 与 RGB的互转(草稿)
YUV 转 RGB cv::Mat yuvImg; /*//下面两行是我自己代码里用来构成YUV图像的数据,可以忽略 yuvImg.create(pInput->height*3/2, pInp ...
- opencv yuv保存本地_OpenCV-dlib-python3实现人脸戴墨镜和含Y的抖音效果
1 说明: ===== 1.1 吸烟有害健康!!纯属娱乐和学习python的相关知识. 1.2 虽然是娱乐,但是opencv.dlib和python在人工智能.人脸识别.自动化等有很大作用,目前已经或 ...
- python cv2模块imshow_Python cv2.imshow方法代码示例
本文整理汇总了Python中cv2.imshow方法的典型用法代码示例.如果您正苦于以下问题:Python cv2.imshow方法的具体用法?Python cv2.imshow怎么用?Python ...
- opencv 解析yuv_OpenCV Mat格式存储YUV图像
YUV图像用的比较多,而且YUV图像的格式众多(YUV格式可以参考YUV pixel formats),如何用OpenCV的Mat类型来存储YUV图像也是经常遇到的问题. 对于YUV444图像来说,就 ...
- YUV格式转换RGB(基于opencv)
在编写代码将需要处理YUV格从每个视频帧中提取,然后将其保存为图片.有两种常见的方法在线,第一种是通过opencv自带cvCvtColor,可是这样的方法有bug.得到的图片会泛白.另外一种方法是公式 ...
- opencv 解析yuv_通过OpenCV读取并显示YUV视频文件
前言 Opencv中通常是读取 avi 格式的视频文件,下面程序是直接读取 YUV格式的视频文件并显示出来. 这里需要将YUV读取出来,使用Mat格式保存再使用 cv::cvtColor() 将每帧的 ...
- yuv转opencv中的IplImage
http://www.2cto.com/kf/201208/145559.html http://www.opencv.org.cn/forum.php?mod=viewthread&tid= ...
- Opencv中BGR、YUV、YUV_I420\NV12分析
文章目录 一.CV_BGR2YUV 二.CV_BGR2YUV_I420 三.I420和NV12的区别以及Opencv中相互转换 四.I420或者NV12转RGB 五.补上demo测试 本地模拟视频解码 ...
- opencv 读取NV12格式(.yuv)文件,并转为RGB格式保存为JPG
实测代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <op ...
最新文章
- java 应用连接oracle 超级慢的解决方法
- php时间区间,优化显示
- 终于!《iOS 全埋点解决方案》正式出版
- 今夜,我们一起缅怀对美好事物痴迷的青葱岁月
- php memcache 64,PHP 5.3.13 memcache win 64 配置和安装
- 字符串大小写字母转换c 语言,towlower()
- python基础知识资料包-Python基础知识总结——史上最全系列
- 微服务跨数据库联合查询_MySQL数据库联合查询
- 习题3.3 线性表元素的区间删除 (20 分)
- [转载]Java多线程——创建线程池的几个核心构造参数
- 4个macOS上隐藏的小技巧
- rs232接口_USB转RS232接口9针串口线,工控数据转接线驱动安装方法
- 安卓中将Java文件转换成Dex文件
- 如何提高技术团队的工作效率
- ttest求pvalue_.net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)
- 微信公众号(获取token 按钮生成 推送消息,微信授权)
- android Settings之辅助功能
- python学习 -女神或者男神把微信消息撤回后好慌,有了这个妈妈再也不担心你看不到女神或者男神撤回的消息了(超详解)...
- 【转】BAT机器学习面试1000题系列(1~50)
- 数据库与身份认证:MySQL的基本使用
热门文章
- Spark:一个高效的分布式计算系统--转
- linux定时任务之crontab
- 必读 | 六月份不容错过的十大重磅好文,机器学习和数据科学的小伙伴拿走不谢 原创 2017-07-10 爱收藏的 AI科技大本营 作者 | Flavian Hautbois 翻译 | AI科技大
- 百度计算广告学沙龙学习笔记 - 内容匹配广告
- html5 progress css,CSS content: attr() on HTML5 progress doesn't work
- mysql 多表联查的效率_Mysql 多表联合查询效率分析
- 算法与数据结构(冒泡排序)
- SpringBoot - 构建监控体系03_使用 Admin Server 管理 Spring 应用程序
- jvm性能调优 - 07线上应用部署JVM实战_栈内存与永久代预估与设置
- 我的世界java手机版下载1.15_我的世界java版20w16a