使用OpenCV将图像转换为NV12格式并加载NV12数据
摘要:在新项目中,需要为上层应用开放几个接口,但又不想让上层应用过多依赖OpenCV。本文将详细介绍如何使用C++和OpenCV,通过加载图片并转换为NV12格式,实现对图像数据的处理,以及如何加载NV12数据并显示。这些步骤对于在相机等设备中处理YUV数据并与OpenCV进行无缝集成非常有用。
用处
新项目需要开放接口给上层应用使用,而相机直接输出的是YUV数据。为了减少上层应用对OpenCV的依赖,需要在函数内部将YUV数据转化为cv::Mat格式。这样,上层应用就无需调用OpenCV的任何操作。测试接口需要使用YUV数据,因此我们还需要保存图像数据为YUV格式,并加载YUV数据进行进一步处理。
步骤
步骤1:加载图片,转换成YUV并保存成NV12数据
void convert2NV12(const std::string& imagePath, const std::string& outputFilePath)
{cv::Mat mat = cv::imread(imagePath);int cropWidth = mat.cols/2*2;int cropHeight = mat.rows/2*2;cv::Mat cropImage = mat(cv::Rect(0 , 0, cropWidth, cropHeight));std::ofstream ofs;ofs.open(outputFilePath, std::ios::binary);// 创建一个YUV图像来存储转换后的数据cv::Mat yuvImage(cropImage.rows *3/2, cropImage.cols, CV_8UC1, cv::Scalar(0)); // Y分量cv::Mat uvImage(cropImage.rows *3/ 2, cropImage.cols, CV_8UC1, cv::Scalar(0)); // UV分量 (NV12)// 进行BGR到YUV颜色空间转换cv::cvtColor(cropImage, yuvImage, cv::COLOR_BGR2YUV_I420);memcpy(uvImage.data, yuvImage.data, cropImage.cols*cropImage.rows);int yLen = cropImage.cols * cropImage.rows;int uvLen = cropImage.cols*cropImage.rows/4;// 将UV分量(U和V)从I420格式提取并排列为NV12格式for (int el = 0; el < uvLen; el++) {uvImage.data[yLen + 2*el] = yuvImage.data[yLen + el];uvImage.data[yLen + 2*el + 1] = yuvImage.data[yLen + el + uvLen];} if(ofs.is_open()){// 写入YUV数据到文件ofs.write(reinterpret_cast<char*>(uvImage.data), uvImage.total() * uvImage.elemSize());// ofs.write(reinterpret_cast<char*>(uvImage.data), cropImage.cols*cropImage.rows*3/2);ofs.flush();ofs.close();}
}
在这个步骤中,我们加载一张图片,将其转换为NV12格式,并保存为NV12文件。convertToNV12 函数接受图片文件路径和输出NV12文件路径两个参数。
步骤2:加载NV12数据并转化成BGR数据显示
cv::Mat loadNV12(const std::string& filePath, int width, int height) {std::ifstream file(filePath, std::ios::binary | std::ios::ate);if (!file.is_open()) {std::cerr << "Error: Unable to open NV12 file " << filePath << std::endl;return cv::Mat();}std::streamsize size = file.tellg();file.seekg(0, std::ios::beg);std::vector<char> buffer(size);if (!file.read(buffer.data(), size)) {std::cerr << "Error: Unable to read NV12 data from file " << filePath << std::endl;return cv::Mat();}cv::Mat nv12Mat(height + height / 2, width, CV_8UC1, buffer.data());return nv12Mat.clone(); // Clone to ensure data ownership
}
这个函数负责加载NV12数据并将其转化为cv::Mat格式。接受NV12文件路径、图像宽度和高度三个参数,并返回cv::Mat格式的NV12数据。
步骤3:主函数
int main() {int width = 640;int height = 480;convertToNV12("input_image.jpg", "output_image.nv12");cv::Mat nv12Image = loadNV12("output_image.nv12", width, height);if (!nv12Image.empty()) {// 此时nv12Image包含了NV12格式的数据,你可以对其进行进一步处理cv::imshow("NV12 Image", nv12Image);cv::waitKey(0);}return 0;
}
主函数演示了如何调用前述两个函数,将图像转换为NV12格式并加载NV12数据进行显示。你可以根据实际需求进一步处理nv12Image。
通过这些步骤,你可以轻松地在新项目中处理YUV数据并与OpenCV集成,同时提供简便的接口给上层应用使用。
相关文章:
使用OpenCV将图像转换为NV12格式并加载NV12数据
摘要:在新项目中,需要为上层应用开放几个接口,但又不想让上层应用过多依赖OpenCV。本文将详细介绍如何使用C和OpenCV,通过加载图片并转换为NV12格式,实现对图像数据的处理,以及如何加载NV12数据并显示。这些…...
【Lodash】 Filter 与Map 的结合使用
用Filter过滤数据之后,想给某个字段重新赋值 在使用 filter() 方法过滤数据后,如果你想给某个字段赋值,你可以使用 map() 方法来修改数组中的元素。map() 方法可以对数组中的每个元素应用一个函数,并返回一个新的数组。 以下是一…...
python命令行 引导用户填写可用的ip地址和端口号
字多不看,直接体验 待补充 演示代码 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 10:29 file: 引导用户填写可用的ip地址和端口号.py desc: xxxxxx """# region 引入必要的依赖 import …...
【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!
想学习python进行数据分析,这本《利用python进行数据分析》是绕不开的一本书。目前该书根据Python3.10已经更新到第三版。 Python 语言极具吸引力。自从 1991 年诞生以来,Python 如今已经成为最受欢迎的解释型编程语言。 pandas 诞生于2008年。它是由韦…...
关于APP备案的通知以及APP备案的常见问题
前言 众所周知今年8月份,工信部出台了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》,APP开发者的影晌是显而易见的。开发者需要按照要求提交相关材料进行备案,这无疑增加了开发者的时间和精力成本。虽然备案制度会增加开发者…...
iOS 17.0 YYText 崩溃处理
YYText,发现在iOS 17上运行会崩溃,触发了系统的断言: UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size{382, 0}, scale3.000000, bitmapInfo0x2002. Use UIGraphicsImageRenderer to avoid this assert. 查了下 ap…...
微信小程序面试题【100道】
文章目录 小程序面试题100问前言一、技术性问题1.有哪些参数传值的方法2.小程序修改数据值与Vue和React有什么差异3.如何实现下拉刷新与上拉加载4.bindtap和catchtap的区别是什么5.小程序有哪些导航API,它们各自的应用场景与差异区别是什么6.小程序中如何使用第三方…...
【nlp】2.8 注意力机制拓展
注意力机制拓展 1 注意力机制原理1.1 注意力机制示意图1.2 Attention计算过程1.3 Attention计算逻辑1.4 有无attention模型对比1.4.1 无attention机制的模型1.4.2 有attention机制的模型1 注意力机制原理 1.1 注意力机制示意图 Attention机制的工作原理并不复杂,我们可以用下…...
mysql 存储引擎ROWS与实际行数不一致
引言 在使用 MySQL 数据库时,我们经常会用到 SHOW TABLE STATUS 命令来获取表的统计信息,其中包括行数(rows)的估计值。然而,有时候我们会发现这个估计值与实际的行数并不一致。本文将探讨这个问题,并提供…...
软考小记-软件工程
模块的控制范围包括模块本身及其所有的从属模块。模块的作用范围是指模块一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围.,原则上一个模块的作用范围应该在其控制范围之内,若没有,则可以将判定所在模块…...
【开源】基于Vue和SpringBoot的创意工坊双创管理系统
项目编号: S 049 ,文末获取源码。 \color{red}{项目编号:S049,文末获取源码。} 项目编号:S049,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、…...
COBOL排序问题
*SORT排序文件文件超长,将主键保存在临时文件里,超长的数据从数组里面去检索获取。 IDENTIFICATION DIVISION. PROGRAM-ID. TEST002. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. …...
数字化转型过程中面临最大的问题是什么?如何借助数字化工具实现快速转型?
在科技快速发展的时代,数字化转型已经成为企业的重要战略。当企业努力适应数字化时代并取得成功时,他们可能会面临各种必须有效应对的挑战。 数字化转型不仅仅是将新技术应用到企业的运营中,还需要对企业的运营方式、与客户的互动方式和价…...
视频剪辑有妙招:批量置入封面,轻松提升视频效果
随着社交媒体的兴起,视频已经成为分享和交流的重要方式。无论是专业的内容创作者还是普通的社交媒体用户,都要在视频剪辑上下一番功夫,才能让视频更具吸引力。而一个吸引的封面往往能在一瞬间抓住眼球,提高点击率。还在因如何选择…...
Java查询多条数据放入word模板 多个word文件处理成zip压缩包并在前端下载.zip文件
需求:Java查询多条数据放入word模板 多个word文件处理成zip压缩包并在前端下载.zip文件 解决方法:在模板的位置定义参数如 {{name}} {{age}}等等,使用 poi 处理 伪代码: PostMapping("/exportPracticeAppr")public S…...
PC8223(CC/CV控制)高耐压输入5V/3.4A同步降压电路内建补偿带恒流恒压输出
概述 PC8233(替代CX8853)是一款同步降压调节器,输出电流高达3.4A,操作范围从8V到32V的宽电源电压。内部补偿要求最低数量现成的标准外部组件。PC8233在CC(恒定输出电流)模式或CV(恒定输出电压)模式&#x…...
【webrtc】ModuleRtpRtcpImpl2: RtpRtcp DEPRECATED_Create 废弃了
基于m98 代码。Deprecate the static RtpRtcp::Create() method. 提交记录RtpRtcp::Create factory method 工厂方法废弃了。std::unique_ptr<RtpRtcp> RtpRtcp::DEPRECATED_Create(const Configuration& configuration) {RTC_DCHECK...
八股文面试day5
测试即(验证产品特性是否符合用户需求、检测系统是否能满足客户需求,是否能正常运行,数据会有没有正确) 测试流程就是:需求评审,编写测试计划,设计测试用例,执行测试用例࿰…...
数据处理生产环境_获取当前日期的前一天日期
需求描述: 我现在有一个dataframe,名为dfin,样例数据如下 a1_id_lxha2_PHtime比亚迪_汉1232023-11-15 12:12:23比亚迪_汉1252023-11-15 13:14:51比亚迪_汉1232023-11-15 12:13:23比亚迪_汉1262023-11-16 14:12:34比亚迪_秦2312023-11-15 14:12:28比亚迪_秦2342023…...
5.过滤敏感词 + 发布帖子 + 帖子详情
目录 1.过滤敏感词 1.1 定义前缀树 1.2 根据敏感词,初始化前缀树 1.3 编写过滤敏感词方法...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
