当前位置: 首页 > news >正文

使用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数据

摘要&#xff1a;在新项目中&#xff0c;需要为上层应用开放几个接口&#xff0c;但又不想让上层应用过多依赖OpenCV。本文将详细介绍如何使用C和OpenCV&#xff0c;通过加载图片并转换为NV12格式&#xff0c;实现对图像数据的处理&#xff0c;以及如何加载NV12数据并显示。这些…...

【Lodash】 Filter 与Map 的结合使用

用Filter过滤数据之后&#xff0c;想给某个字段重新赋值 在使用 filter() 方法过滤数据后&#xff0c;如果你想给某个字段赋值&#xff0c;你可以使用 map() 方法来修改数组中的元素。map() 方法可以对数组中的每个元素应用一个函数&#xff0c;并返回一个新的数组。 以下是一…...

python命令行 引导用户填写可用的ip地址和端口号

字多不看&#xff0c;直接体验 待补充 演示代码 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 10:29 file: 引导用户填写可用的ip地址和端口号.py desc: xxxxxx """# region 引入必要的依赖 import …...

【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!

想学习python进行数据分析&#xff0c;这本《利用python进行数据分析》是绕不开的一本书。目前该书根据Python3.10已经更新到第三版。 Python 语言极具吸引力。自从 1991 年诞生以来&#xff0c;Python 如今已经成为最受欢迎的解释型编程语言。 pandas 诞生于2008年。它是由韦…...

关于APP备案的通知以及APP备案的常见问题

前言 众所周知今年8月份&#xff0c;工信部出台了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;APP开发者的影晌是显而易见的。开发者需要按照要求提交相关材料进行备案&#xff0c;这无疑增加了开发者的时间和精力成本。虽然备案制度会增加开发者…...

iOS 17.0 YYText 崩溃处理

YYText&#xff0c;发现在iOS 17上运行会崩溃&#xff0c;触发了系统的断言&#xff1a; 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&#xff0c;它们各自的应用场景与差异区别是什么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 数据库时&#xff0c;我们经常会用到 SHOW TABLE STATUS 命令来获取表的统计信息&#xff0c;其中包括行数&#xff08;rows&#xff09;的估计值。然而&#xff0c;有时候我们会发现这个估计值与实际的行数并不一致。本文将探讨这个问题&#xff0c;并提供…...

软考小记-软件工程

模块的控制范围包括模块本身及其所有的从属模块。模块的作用范围是指模块一个判定的作用范围&#xff0c;凡是受这个判定影响的所有模块都属于这个判定的作用范围.&#xff0c;原则上一个模块的作用范围应该在其控制范围之内&#xff0c;若没有&#xff0c;则可以将判定所在模块…...

【开源】基于Vue和SpringBoot的创意工坊双创管理系统

项目编号&#xff1a; S 049 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S049&#xff0c;文末获取源码。} 项目编号&#xff1a;S049&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、…...

COBOL排序问题

*SORT排序文件文件超长&#xff0c;将主键保存在临时文件里&#xff0c;超长的数据从数组里面去检索获取。 IDENTIFICATION DIVISION. PROGRAM-ID. TEST002. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. …...

数字化转型过程中面临最大的问题是什么?如何借助数字化工具实现快速转型?

在科技快速发展的时代&#xff0c;数字化转型已经成为企业的重要战略。当企业努力适应数字化时代并取得成功时&#xff0c;他们可能会面临各种必须有效应对的挑战。   数字化转型不仅仅是将新技术应用到企业的运营中&#xff0c;还需要对企业的运营方式、与客户的互动方式和价…...

视频剪辑有妙招:批量置入封面,轻松提升视频效果

随着社交媒体的兴起&#xff0c;视频已经成为分享和交流的重要方式。无论是专业的内容创作者还是普通的社交媒体用户&#xff0c;都要在视频剪辑上下一番功夫&#xff0c;才能让视频更具吸引力。而一个吸引的封面往往能在一瞬间抓住眼球&#xff0c;提高点击率。还在因如何选择…...

Java查询多条数据放入word模板 多个word文件处理成zip压缩包并在前端下载.zip文件

需求&#xff1a;Java查询多条数据放入word模板 多个word文件处理成zip压缩包并在前端下载.zip文件 解决方法&#xff1a;在模板的位置定义参数如 {{name}} {{age}}等等&#xff0c;使用 poi 处理 伪代码&#xff1a; PostMapping("/exportPracticeAppr")public S…...

PC8223(CC/CV控制)高耐压输入5V/3.4A同步降压电路内建补偿带恒流恒压输出

概述 PC8233&#xff08;替代CX8853&#xff09;是一款同步降压调节器,输出电流高达3.4A,操作范围从8V到32V的宽电源电压。内部补偿要求最低数量现成的标准外部组件。PC8233在CC&#xff08;恒定输出电流&#xff09;模式或CV&#xff08;恒定输出电压&#xff09;模式&#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

测试即&#xff08;验证产品特性是否符合用户需求、检测系统是否能满足客户需求&#xff0c;是否能正常运行&#xff0c;数据会有没有正确&#xff09; 测试流程就是&#xff1a;需求评审&#xff0c;编写测试计划&#xff0c;设计测试用例&#xff0c;执行测试用例&#xff0…...

数据处理生产环境_获取当前日期的前一天日期

需求描述&#xff1a; 我现在有一个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 编写过滤敏感词方法...

CowAgent:从零部署AI智能体,打造你的超级数字助理

1. 项目概述与核心价值 如果你和我一样&#xff0c;是个喜欢折腾的开发者&#xff0c;或者是一个希望将AI能力深度融入日常工作流的效率追求者&#xff0c;那么你肯定不止一次地想过&#xff1a;能不能有一个AI助手&#xff0c;它不仅能聊天&#xff0c;还能真正“动手”帮你做…...

OpCore Simplify完全手册:零基础轻松创建专业级OpenCore EFI配置

OpCore Simplify完全手册&#xff1a;零基础轻松创建专业级OpenCore EFI配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾经因为复杂的Ope…...

Android Navigation 组件全面讲解

目录 一、Navigation 的基本使用 1.1 Navigation 的三大核心概念 1.2 环境配置 1.3 实现步骤详解 第一步&#xff1a;创建 Navigation Graph (XML) 第二步&#xff1a;创建 Activity activity_main.xml &#xff1a; MainActivity.java &#xff1a; 1. 获取导航遥控器…...

DPCRN vs. Conv-TasNet:语音增强两大流派实战对比,选哪个更合适?

DPCRN与Conv-TasNet&#xff1a;语音增强技术选型实战指南 在实时通信和音频处理领域&#xff0c;语音增强技术正成为提升用户体验的关键组件。无论是远程会议中的环境噪声抑制&#xff0c;还是录音设备中的语音清晰度优化&#xff0c;选择合适的技术路线直接影响最终产品的表现…...

车载C#中控实时通信“黑盒”深度拆解:Wireshark抓包+ETW事件追踪+CANoe仿真三重验证(附独家诊断工具链)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;车载C#中控系统实时通信 在现代智能座舱架构中&#xff0c;C# 依托 .NET 6 和 Windows IoT / Automotive OS 运行时&#xff0c;已成为高可靠性车载中控系统的核心开发语言。实时通信能力直接决定人机交…...

MinIO 国产平替,RustFS 发布 Beta 版本啦

历经 2850 次 Git 提交&#xff0c;99 个 alpha 版本&#xff0c;我们正式发布 RustFS Beta 版。 自从 2025 年 7 月正式开源以来&#xff0c;RustFS 累计获得 26.5k star&#xff0c;1.1k fork&#xff0c;全球贡献者数量超 130 位&#xff0c;DockerHub 镜像拉取次数更是超过…...

医疗器械环境运输试验概要

医疗器械环境运输试验概要 标准GB/T 14710是中国针对医用电气设备环境适应性及运输试验的国家标准&#xff0c;全称为《医用电气设备环境要求及试验方法》。该标准规定了医用电气设备在不同环境条件下的适应性测试要求&#xff0c;包括气候、机械、运输等多个方面&#xff0c;确…...

改进残差收缩网络轴承声发射信号识别【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;查看文章底部二维码&#xff08;1&#xff09;辛几何模态分解动态阈值优化&#xff1a;针对声发射…...

ARM PMU性能监控单元架构与RLU/RLH机制解析

1. ARM PMU性能监控单元架构解析性能监控单元(Performance Monitoring Unit, PMU)是现代处理器架构中用于硬件性能分析和事件监控的关键组件。在ARM架构中&#xff0c;PMUv3作为第三代性能监控架构&#xff0c;提供了强大的性能计数和事件采样能力。与传统的软件性能分析工具相…...

拆解维修指南:当你的大扭矩电动扳手‘罢工’,如何自己动手排查行星齿轮与谐波传动故障?

大扭矩电动扳手行星齿轮与谐波传动故障排查实战手册 当220V大扭矩电动扳手突然"罢工"&#xff0c;输出无力、发出异响或完全卡死时&#xff0c;多数故障都隐藏在行星齿轮组和谐波传动系统中。本文将带您深入传动机构内部&#xff0c;用维修工的视角拆解这些精密部件&…...