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

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::convertTocv::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()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像保存到指定的文件中。 函数 imwrite 将图像保存到指定的文件中。图像格式是根据文件名扩展名选择的&#xff08;参见 cv::imread 获取扩展…...

JVM(HotSpot):方法区(Method Area)

文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后&#xff0c;方法区是JVM内存的一个逻辑结构&#xff0c;真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。 …...

JWT的基础与使用

JWT&#xff08;JSON Web Token&#xff09; 是一种用于在各方之间传输信息的紧凑、安全的方式&#xff0c;常用于身份验证和授权。它以令牌的形式将用户信息编码后传输&#xff0c;可以确保数据的完整性和安全性。 1.JWT的结构 JWT 是一个基于 JSON 的令牌&#xff0c;由三部…...

处理 VA02修改行项目计划行(SCHEDULE LINES )报错:不可能确定一个消耗帐户

用户修改销售订单行项目 计划行(SCHEDULE LINES) &#xff0c;从 “CN”改为“CB”时候发生报错提示&#xff1a;不可能确定一个消耗帐户。 Not possible to determine a consumption account Message No. 06138 Diagnosis The system was not able to determine a consumpti…...

【AI基础】pytorch lightning 基础学习

传统pytorch工作流是首先定义模型框架&#xff0c;然后写训练和验证&#xff0c;测试循环代码。训练&#xff0c;验证&#xff0c;测试代码写起来比较繁琐。这里介绍使用pytorch lightning 部署模型&#xff0c;加速模型训练和验证&#xff0c;记录。 准备工作 1 安装pytorch…...

高通量测序技术--组蛋白甲基化修饰、DNA亲和纯化测序,教授(优青)团队指导:从实验设计、结果分析到SCI论文辅助

组蛋白甲基化修饰工具(H3K4me3 ChIP-seq)组蛋白甲基化类型也有很多种&#xff0c;包括赖氨酸甲基化位点H3K4、H3K9、H3K27、H3K36、H3K79和H4K20等。组蛋白H3第4位赖氨酸的甲基化修饰(H3K4)在进化上高度保守&#xff0c;是被研究最多的组蛋白修饰之一。 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实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

FME辅助规划选址

1.需求&#xff1a;新建运动场馆 用地需求&#xff1a;至少1km*2km 找到符合要求的储备地块 2.已有资源&#xff1a;储备用地 现在城市地块储备比较充足&#xff0c;但都是不规则地块 找出可以建大型场馆的地块 3.问题分析 图斑内部可以放下1000*2000的矩形 4.解决思路…...

Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.

一运行就循环打印这个报错&#xff0c; 解决办法&#xff0c;每次改参数之后在HIerarchy中手动保存&#xff0c;就会停止循环打印&#xff0c;style中的字体也显示出来了&#xff0c; 或者 直接换个低版本的...

实战篇 | WSL迁移Linux系统到非系统盘(完整实操版)

1. 操作步骤 1.1 确认要导出的Linux系统是否存在&#xff08;可跳过&#xff09; # 终端命令 # 查看通过WSL安装的Linux系统列表 wsl -l1.2 导出Linux系统为tar包 # 终端命令 # 格式&#xff08;过&#xff09; wsl --export <Distribution Name> <File Name> #…...

增量式编码器实现原理

目录 概述 1 认识增量式编码器 1.1 概述 1.2 增量式编码器的特性 1.3 编码器的硬件 2 增量式编码器实现原理 2.1 编码器信号 2.2 正反转判断 概述 本文主要介绍增量式编码器实现原理&#xff0c;包括增量式编码器的特性&#xff0c;信号特性&#xff0c;以及如何使用编…...

数据集-目标检测系列-口罩检测数据集 mask>> DataBall

数据集-目标检测系列-口罩检测数据集 mask>> DataBall 数据集-目标检测系列-口罩检测数据集 mask 数据量&#xff1a;1W DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;享有百种数据集&#xff0c;持续增加中。 数据项目地址&#xff1a; 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的作用是什么&#xff1f;xml特点 注解什么是注解&#xff1f;注解的使用注解的重要…...

Linux下的基本指令/命令(二)

热键 Tab&#xff1a; 连点两次 对命令进补齐 或者 显式 以目前所需字母 开头的指令。 也可以进行路径补齐 或者 显示所写的文件所处路径上的所有文件。 如果什么也没写&#xff0c;直接按Tab会显示所有命令 Ctrl C&#xff1a; 一旦出现失控的状态&#xff0c;或者任何无法…...

CentOs-Stream-9 设置静态IP外网访问

CentOs-Stream-9 设置静态IP&#xff0c;实现外网访问。这里面有些需要注意的地方&#xff0c;比如IP网段跟我们的宿主机不一样&#xff0c;需要查看具体的网络适配器网段&#xff0c;这样可以快速实现网络互通&#xff1b;另外它的网络配置文件也是不一样的。网络适配器对应的…...

精密制造的革新:光谱共焦传感器与工业视觉相机的融合

在现代精密制造领域&#xff0c;对微小尺寸、高精度产品的检测需求日益迫切。光谱共焦传感器凭借其非接触、高精度测量特性脱颖而出&#xff0c;而工业视觉相机则以其高分辨率、实时成像能力著称。两者的融合&#xff0c;不仅解决了传统检测方式在微米级别测量上的局限&#xf…...

边缘计算与 Python Web 应用:从理论到实践

边缘计算与 Python Web 应用&#xff1a;从理论到实践 目录 &#x1f310; 边缘计算基础 1.1 边缘计算的概念与云计算的区别1.2 边缘计算在物联网&#xff08;IoT&#xff09;与实时应用中的作用 &#x1f5a5;️ Python 在边缘设备上的部署 2.1 在 Raspberry Pi、Jetson Nan…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...