OpenCV图像文件读写(6)将图像数据写入文件的函数imwrite()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
将图像保存到指定的文件中。
函数 imwrite 将图像保存到指定的文件中。图像格式是根据文件名扩展名选择的(参见 cv::imread 获取扩展名列表)。一般来说,只有 8 位无符号整型(CV_8U)单通道或 3 通道(‘BGR’ 通道顺序)的图像可以用此函数保存,但有以下例外:
- 使用 OpenEXR 编码器,只能保存 32 位浮点型(CV_32F)图像。
- 不支持保存 8 位无符号整型(CV_8U)图像。
- 使用 Radiance HDR 编码器,可以保存非 64 位浮点型(CV_64F)图像。
- 所有图像都将转换为 32 位浮点型(CV_32F)。
- 使用 JPEG 2000 编码器,可以保存 8 位无符号整型(CV_8U)和 16 位无符号整型(CV_16U)图像。
- 使用 PAM 编码器,可以保存 8 位无符号整型(CV_8U)和 16 位无符号整型(CV_16U)图像。
- 使用 PNG 编码器,可以保存 8 位无符号整型(CV_8U)和 16 位无符号整型(CV_16U)图像。
- 带有 Alpha 通道的 PNG 图像可以使用此函数保存。为此,创建一个 8 位(或 16 位)4 通道的 BGRA 图像,其中 Alpha 通道放在最后。完全透明的像素应将 Alpha 设为 0,完全不透明的像素应将 Alpha 设为 255/65535(参见下面的代码示例)。
- 使用 PGM/PPM 编码器,可以保存 8 位无符号整型(CV_8U)和 16 位无符号整型(CV_16U)图像。
- 使用 TIFF 编码器,可以保存 8 位无符号整型(CV_8U)、16 位无符号整型(CV_16U)、32 位浮点型(CV_32F)和 64 位浮点型(CV_64F)图像。
- 多个图像(Mat 的向量)可以以 TIFF 格式保存(参见下面的代码示例)。
- 32 位浮点型 3 通道(CV_32FC3)TIFF 图像将以 LogLuv 高动态范围编码方式保存(每个像素 4 字节)。
如果图像格式不支持,图像将转换为 8 位无符号整型(CV_8U)并以这种方式保存。
如果格式、深度或通道顺序不同,请在保存前使用 Mat::convertTo 和 cv::cvtColor 进行转换。或者,使用通用的 FileStorage I/O 函数将图像保存为 XML 或 YAML 格式。
下面的示例展示了如何创建一个 BGRA 图像,如何设置自定义压缩参数并将它保存为 PNG 文件。它还演示了如何将多个图像保存在一个 TIFF 文件中:
#include <opencv2/imgcodecs.hpp>
using namespace cv;
using namespace std;
static void paintAlphaMat(Mat &mat)
{CV_Assert(mat.channels() == 4);for (int i = 0; i < mat.rows; ++i){for (int j = 0; j < mat.cols; ++j){Vec4b& bgra = mat.at<Vec4b>(i, j);bgra[0] = UCHAR_MAX; // Bluebgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Greenbgra[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Redbgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha}}
}
int main()
{Mat mat(480, 640, CV_8UC4); // Create a matrix with alpha channelpaintAlphaMat(mat);vector<int> compression_params;compression_params.push_back(IMWRITE_PNG_COMPRESSION);compression_params.push_back(9);bool result = false;try{result = imwrite("alpha.png", mat, compression_params);}catch (const cv::Exception& ex){fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());}if (result)printf("Saved PNG file with alpha data.\n");elseprintf("ERROR: Can't save PNG file.\n");vector<Mat> imgs;imgs.push_back(mat);imgs.push_back(~mat);imgs.push_back(mat(Rect(0, 0, mat.cols / 2, mat.rows / 2)));imwrite("test.tiff", imgs);printf("Multiple files saved in test.tiff\n");return result ? 0 : 1;
}
cv::imwrite 函数是 OpenCV 提供的一个用于将图像数据写入文件的函数。这个函数可以将 cv::Mat 对象中的图像数据保存为指定格式的文件。
函数原型
bool cv::imwrite
(const String & filename,InputArray img,const std::vector< int > & params = std::vector< int >()
)
参数
- 参数filename 文件的名称。
- 参数img (Mat 或 Mat 向量) 要保存的图像或图像集合。
- 参数params 格式特定的参数作为成对出现的值(paramId_1, paramValue_1, paramId_2, paramValue_2, …),参见 cv::ImwriteFlags。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>int main()
{// 创建一个图像cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 ); // 创建一个 100x100 大小的黑色图像cv::rectangle( img, cv::Point( 20, 20 ), cv::Point( 80, 80 ), cv::Scalar( 0, 0, 255 ), -1 ); // 在图像中心画一个红色矩形// 设置 JPEG 压缩参数std::vector< int > params;params.push_back( cv::IMWRITE_JPEG_QUALITY ); // 设置 JPEG 压缩质量params.push_back( 90 ); // 压缩质量为 90%// 保存图像bool success = cv::imwrite( "output.jpg", img, params );if ( !success ){std::cout << "Failed to save the image." << std::endl;return -1;}std::cout << "Image saved successfully." << std::endl;return 0;
}
运行结果
Image saved successfully.
相关文章:
OpenCV图像文件读写(6)将图像数据写入文件的函数imwrite()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像保存到指定的文件中。 函数 imwrite 将图像保存到指定的文件中。图像格式是根据文件名扩展名选择的(参见 cv::imread 获取扩展…...
JVM(HotSpot):方法区(Method Area)
文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后,方法区是JVM内存的一个逻辑结构,真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。 …...
JWT的基础与使用
JWT(JSON Web Token) 是一种用于在各方之间传输信息的紧凑、安全的方式,常用于身份验证和授权。它以令牌的形式将用户信息编码后传输,可以确保数据的完整性和安全性。 1.JWT的结构 JWT 是一个基于 JSON 的令牌,由三部…...
处理 VA02修改行项目计划行(SCHEDULE LINES )报错:不可能确定一个消耗帐户
用户修改销售订单行项目 计划行(SCHEDULE LINES) ,从 “CN”改为“CB”时候发生报错提示:不可能确定一个消耗帐户。 Not possible to determine a consumption account Message No. 06138 Diagnosis The system was not able to determine a consumpti…...
【AI基础】pytorch lightning 基础学习
传统pytorch工作流是首先定义模型框架,然后写训练和验证,测试循环代码。训练,验证,测试代码写起来比较繁琐。这里介绍使用pytorch lightning 部署模型,加速模型训练和验证,记录。 准备工作 1 安装pytorch…...
高通量测序技术--组蛋白甲基化修饰、DNA亲和纯化测序,教授(优青)团队指导:从实验设计、结果分析到SCI论文辅助
组蛋白甲基化修饰工具(H3K4me3 ChIP-seq)组蛋白甲基化类型也有很多种,包括赖氨酸甲基化位点H3K4、H3K9、H3K27、H3K36、H3K79和H4K20等。组蛋白H3第4位赖氨酸的甲基化修饰(H3K4)在进化上高度保守,是被研究最多的组蛋白修饰之一。 DNA亲和纯化测序 DNA亲…...
[极客大挑战 2019]RCE ME1
<?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight_file(__FILE__); }// ?>…...
计算机毕业设计 中医院问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
FME辅助规划选址
1.需求:新建运动场馆 用地需求:至少1km*2km 找到符合要求的储备地块 2.已有资源:储备用地 现在城市地块储备比较充足,但都是不规则地块 找出可以建大型场馆的地块 3.问题分析 图斑内部可以放下1000*2000的矩形 4.解决思路…...
Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.
一运行就循环打印这个报错, 解决办法,每次改参数之后在HIerarchy中手动保存,就会停止循环打印,style中的字体也显示出来了, 或者 直接换个低版本的...
实战篇 | WSL迁移Linux系统到非系统盘(完整实操版)
1. 操作步骤 1.1 确认要导出的Linux系统是否存在(可跳过) # 终端命令 # 查看通过WSL安装的Linux系统列表 wsl -l1.2 导出Linux系统为tar包 # 终端命令 # 格式(过) wsl --export <Distribution Name> <File Name> #…...
增量式编码器实现原理
目录 概述 1 认识增量式编码器 1.1 概述 1.2 增量式编码器的特性 1.3 编码器的硬件 2 增量式编码器实现原理 2.1 编码器信号 2.2 正反转判断 概述 本文主要介绍增量式编码器实现原理,包括增量式编码器的特性,信号特性,以及如何使用编…...
数据集-目标检测系列-口罩检测数据集 mask>> DataBall
数据集-目标检测系列-口罩检测数据集 mask>> DataBall 数据集-目标检测系列-口罩检测数据集 mask 数据量:1W DataBall 助力快速掌握数据集的信息和使用方式,享有百种数据集,持续增加中。 数据项目地址: gitcode: https…...
工作安排 - 华为OD统一考试(E卷)
2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定…...
STM32 GPIO - 笔记
1 STM32的GPIO是漏还是源 在 STM32 微控制器中,GPIO(通用输入/输出)引脚既可以配置为漏极开路输出(Open-Drain)模式,也可以配置为推挽输出(Push-Pull)模式。因此,GPIO 引脚既可以作为“漏”(吸电流,Open-Drain),也可以作为“源”(供电流,Push-Pull)来使用。 GP…...
三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码
文章目录 IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点 进程 线程创建线程的三种方式 网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码 XMLXML的作用是什么?xml特点 注解什么是注解?注解的使用注解的重要…...
Linux下的基本指令/命令(二)
热键 Tab: 连点两次 对命令进补齐 或者 显式 以目前所需字母 开头的指令。 也可以进行路径补齐 或者 显示所写的文件所处路径上的所有文件。 如果什么也没写,直接按Tab会显示所有命令 Ctrl C: 一旦出现失控的状态,或者任何无法…...
CentOs-Stream-9 设置静态IP外网访问
CentOs-Stream-9 设置静态IP,实现外网访问。这里面有些需要注意的地方,比如IP网段跟我们的宿主机不一样,需要查看具体的网络适配器网段,这样可以快速实现网络互通;另外它的网络配置文件也是不一样的。网络适配器对应的…...
精密制造的革新:光谱共焦传感器与工业视觉相机的融合
在现代精密制造领域,对微小尺寸、高精度产品的检测需求日益迫切。光谱共焦传感器凭借其非接触、高精度测量特性脱颖而出,而工业视觉相机则以其高分辨率、实时成像能力著称。两者的融合,不仅解决了传统检测方式在微米级别测量上的局限…...
边缘计算与 Python Web 应用:从理论到实践
边缘计算与 Python Web 应用:从理论到实践 目录 🌐 边缘计算基础 1.1 边缘计算的概念与云计算的区别1.2 边缘计算在物联网(IoT)与实时应用中的作用 🖥️ Python 在边缘设备上的部署 2.1 在 Raspberry Pi、Jetson Nan…...
17个AI新闻站吸4.4万访客,10美元即可搭建,滥用AI威胁原创媒体!
《佛罗里达论坛报》揭秘AI伪媒体系统智东西5月15日报道,当地时间5月14日,美国调查媒体《佛罗里达论坛报》披露,南佛州《南佛罗里达标准报》是由AI批量生成的伪媒体系统。该网站包装本地新闻团队,用AI生成记者头像、履历和邮箱&…...
从换电博弈到芯片浪潮:新能源汽车与半导体产业交叉机遇解析
1. 行业动态深度解析:从换电博弈到芯片浪潮最近行业里几件事儿挺有意思,放在一起看,能品出不少门道。一边是造车新势力在补能路线上开始“左右互搏”,小鹏汽车悄悄注册了一家经营范围包含“新能源汽车换电设施销售”的子公司&…...
2026openclaw+hermes agent 安装指南3.0版
2026 年人工智能行业悄然完成了一场意义深远的战略转向。曾经如火如荼的纯对话大模型参数规模竞赛已成为过去,能够真正解决实际问题、具备落地执行能力的自主智能体,正式登上了历史舞台的中央,成为新一代生产力工具的核心驱动力。 在众多开源…...
告别混乱的微生物组数据:手把手教你用R包MaAsLin2找出关键关联(附IBD研究实战代码)
微生物组数据关联分析实战:用MaAsLin2解锁IBD研究的关键发现 当面对成百上千个微生物物种丰度与数十项临床指标的复杂关系网时,许多研究者常陷入"数据沼泽"——明明手握高通量测序结果,却难以提炼出具有生物学意义的关联模式。这正…...
I2C虚拟项目笔记(二)-virtual sequence实战:中断与异常场景构建
1. 为什么需要模拟中断与异常场景? 在实际的I2C总线通信中,各种异常情况时有发生。比如从设备突然掉电导致无应答(NACK),或者主设备在发送数据时遭遇干扰导致传输中断。这些场景如果不在验证阶段充分覆盖,…...
向量寄存器文件优化:Register Dispersion技术解析
1. 向量寄存器文件的技术挑战与优化背景在处理器架构设计中,向量寄存器文件(Vector Register File, VRF)作为向量处理单元(VPU)的核心组件,承担着存储和管理向量数据的关键任务。传统VRF设计通常采用固定数…...
Redis分布式锁进阶第一二十五篇
Redis分布式锁进阶第二十五篇:联锁深度拆解 多资源交叉死锁根治 复杂业务多级加锁绝对有序方案一、本篇前置衔接 第二十四篇我们完成了全系列终局复盘,整理了故障排查SOP与企业级落地铁律。常规单资源锁、热点分片锁、隔离锁全部讲透,但真实…...
如何高效使用大麦网抢票脚本:5分钟快速上手终极指南
如何高效使用大麦网抢票脚本:5分钟快速上手终极指南 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到心仪的演唱会门票而烦恼吗?面对秒光的票源和昂贵的黄牛票…...
赣州 GEO 科普|AI 时代品牌信息基建,七文 GEO 助力品牌长效可见
赣州GEO科普|AI时代品牌信息基建,读懂生成式引擎优化逻辑人工智能全面普及的当下,生成式AI正在重塑大众的信息获取方式。如今多数用户习惯借助文心一言等AI工具检索品牌、查询行业服务,人工智能会整合全网信息进行智能作答。在此行…...
在Windows上安装安卓应用的终极指南:APK安装器完整使用教程
在Windows上安装安卓应用的终极指南:APK安装器完整使用教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想要在Windows电脑上直接运行安卓应用吗&#x…...
