NV16和BGR相互转换C++实现
一、NV16格式
Y分量单独存放,UV分量交错存放(先U后V),2个Y共用1个UV,总长度为W×H×2。通道数为2,平均每个像素占16位,故称NV16格式。
Y Y Y Y
Y Y Y Y
U V U V
U V U V
二、NV16转BGR
static void NV16_2_BGR(const cv::Mat &yuv_image, unsigned char *buffer) {int bgr_image_width = yuv_image.cols;int bgr_image_height = yuv_image.rows / 2;cv::Mat bgr_image = cv::Mat(bgr_image_height, bgr_image_width, CV_8UC3);int length_y = bgr_image_width * bgr_image_height;int length_uv = length_y >> 1;unsigned char *pt_yuv_y = yuv_image.data;unsigned char *pt_yuv_uv = yuv_image.data + length_y;for (int h = 0; h < bgr_image_height; ++h){cv::Vec3b *pt_bgr_image_line = bgr_image.ptr<cv::Vec3b>(h);unsigned char *pt_yuv_y_line = pt_yuv_y + h * bgr_image_width;unsigned char *pt_yuv_uv_line = pt_yuv_uv + h * bgr_image_width;for (int w = 0; w < bgr_image_width; ++w){unsigned char y, u, v;int b, g, r;y = pt_yuv_y_line[w];if (w%2 == 0){u = pt_yuv_uv_line[w];v = pt_yuv_uv_line[w+1];}if (w%2 == 1){u = pt_yuv_uv_line[w-1];v = pt_yuv_uv_line[w];}r = y + ((360 * (v - 128) + 128) >> 8);g = y - (((88 * (u - 128) + 184 * (v - 128)) - 128) >> 8);b = y + ((455 * (u - 128) + 128) >> 8);if (b < 0)b = 0;if (b > 255)b = 255;if (g < 0)g = 0;if (g > 255)g = 255;if (r < 0)r = 0;if (r > 255)r = 255;pt_bgr_image_line[w][0] = b;pt_bgr_image_line[w][1] = g;pt_bgr_image_line[w][2] = r;}}int length = bgr_image_width*bgr_image_height*3;memcpy(buffer, bgr_image.data, length);
}
三、BGR转NV16
static void BGR_2_NV16(const cv::Mat &bgr_image, unsigned char *buffer) {int bgr_image_width = bgr_image.cols;int bgr_image_height = bgr_image.rows;int length_y = bgr_image_width * bgr_image_height;int length_uv = length_y >> 1;unsigned char *pt_yuv_y = buffer;unsigned char *pt_yuv_uv = buffer + length_y;for (int h = 0; h < bgr_image_height; ++h){const cv::Vec3b *pt_bgr_image_line = bgr_image.ptr<cv::Vec3b>(h);unsigned char *pt_yuv_y_line = pt_yuv_y + h * bgr_image_width;unsigned char *pt_yuv_uv_line = pt_yuv_uv + h * bgr_image_width;for (int w = 0; w < bgr_image_width; ++w){unsigned char b, g, r;int y, u, v;b = pt_bgr_image_line[w][0];g = pt_bgr_image_line[w][1];r = pt_bgr_image_line[w][2];y = (77 * r + 150 * g + 29 * b + 128) >> 8;if (y < 0)y = 0;if (y > 255)y = 255;pt_yuv_y_line[w] = y;if (w%2 == 0){u = ((-44 * r - 87 * g + 131 * b + 128) >> 8) + 128;v = ((131 * r - 110 * g - 21 * b + 128) >> 8) + 128;if (u < 0)u = 0;if (u > 255)u = 255;if (v < 0)v = 0;if (v > 255)v = 255;pt_yuv_uv_line[w] = u;pt_yuv_uv_line[w+1] = v;}}}
}
YUV格式详解参见:YUV 格式详解,只看这一篇就够了(转)
NV16和BGR相互转换C++实现相关推荐
- 3、TensorFlow 的数据模型-----张量(Tensor)
一.Tensor 类简介 Tensor 定义 A Tensor is a symbolic handle to one of the outputs of an Operation. It does ...
- 【超直白讲解opencv RGB与BGR】RGB模式与BGR模式有什么不同,如何相互转换?
一.为什么会有BGR和RGB两种通道? 首先RGB与BGR本质都没有什么区别,OpenCV和PIL读取图片的格式分别是BGR和RGB. 当我们使用OpenCV读取图像时,你应该也会发现读取的数组其实是 ...
- bgr与rgb相互转换
在opencv中的图像是以bgr形式存放的,但很多场景默认的是rgb形式的图像,这就导致实际应用中的颜色错乱,以下是bgr和rgb相互转换的函数: def rgb_bgr(r_color):r_col ...
- 使用C++实现YUV格式图像与RGB格式图像之间相互转换
使用C++实现YUV格式图像与RGB格式图像之间相互转换 一.RGB与YUV转换公式 1.RGB转YUV 1)RGB转换亮度与色差信号公试: 2)归一化为YUV的转化公试为: 2.YUV转RGB 二. ...
- YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24
对于YUV422的格式,网上有一大堆资料,这里就不说了.直奔主题,给出如何转换的函数,一如既往,只用代码说事. YUV422有打包格式(Packed),一如前文所述.同时还有平面格式(Planar), ...
- python image.open函数_PIL.Image.open和cv2.imread的比较与相互转换的方法
摘要 PIL.Image.open读入的是RGB顺序,而opencv中cv2.imread读入的是BGR通道顺序 .cv2.imread会显示图片更蓝一些. cv2.imread(path,读取方式) ...
- Opencv中BGR、YUV、YUV_I420\NV12分析
文章目录 一.CV_BGR2YUV 二.CV_BGR2YUV_I420 三.I420和NV12的区别以及Opencv中相互转换 四.I420或者NV12转RGB 五.补上demo测试 本地模拟视频解码 ...
- bmp格式 8bit与24bit深度相互转换
bmp格式 8bit与24bit相互转换 一.实验要求 在图像处理软件中生成8bit和24bit深度的BMP文件,编写程序实现不同像素深度文件的相互转换.重点掌握函数定义.缓存区分配.倒序读写.结构体 ...
- ROS图像与OpenCV图像相互转换
参考: https://blog.csdn.net/u013794793/article/details/79925491 使用cv_bridge将ROS图像转换为OpenCV图像,以及OpenCV图 ...
最新文章
- RabbitMQ消息手动应答消费者
- kali linux学习入门- Chrome浏览器安装,可以正常打开
- [Vue.js]实战 -- 电商项目(八)
- postgresql表中间加列_PostgreSQL ALTER TABLE命令
- 点到曲线的距离公式_推导点到直线的距离公式到底有多少种方法?
- 关于python全局变量
- 实体与表映射关系XXX.hbm.xml配置详解(转)
- YII 学习笔记(2)(未完)
- adadelta算法_机器学习中的优化算法(3)-AdaGrad, Adadelta(附Python示例)
- zscore标准化步骤_matlab标准化和反标准化——zscore
- php mysql orm_初探PHP ORM框架Doctrine
- linux加载和卸载驱动模块出现 'XXX': device or resource busy 错误提示
- R | 导入excel文件乱码
- 2016 上半年 VR 报告:潜在用户4.5亿
- QGIS-创建QGIS项目
- 人民币升值和贬值的影响
- 雷蛇计算机配置似乎是正确的,配置保存需技巧 玩转雷蛇驱动
- Oracle内存过度消耗风险提醒
- 自由天空GhostXP纯净版v1.1
- 分享|GB4943.1-2022标准更新差异测试解读
热门文章
- 【论文阅读】Where Did You Learn That From? Surprising Effectiveness of Membership Inference Attacks Agains
- 重庆大学计算机学院博士复试分数线,计算机学院2017年博士研究生招生复试录取工作实施细则...
- 安全可信 | 首批+先进!天翼全栈混合云一举斩获三项可信云评估
- Android 自定义View 手写瀑布流组件FlowLayout
- 【贪心算法】最小能量消耗
- 关于亚马逊MWS API 看这一篇就够了
- 数字签名和验签的详细过程
- python气象数据处理与绘图_Python气象数据处理与绘图(15):两种波作用通量计算的python实现及对比(Plumb T-N) (已更正)...
- 【Redis】Redis安装、应用场景、数据类型、配置文件(很全)、发布订阅、事务、分布式锁、持久化、主从复制、集群等
- lerarning Javascript 犀牛书