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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用git将项目上传到github

采用git而不是在pycharm中共享的原因&#xff1a;可能会出现上图报错 目录 1、创建github仓库2、在 git bash 中初始化Git仓库&#xff0c;添加文件&#xff0c;上传代码 1、创建github仓库 2、在 git bash 中初始化Git仓库&#xff0c;添加文件&#xff0c;上传代码

[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

LabVIEW提高开发效率技巧----利用第三方库和工具

LabVIEW开发不仅依赖于自身强大的图形化编程能力&#xff0c;还得益于其庞大的用户社区和丰富的第三方库。这些工具和库能够帮助开发者快速解决问题&#xff0c;提升开发效率&#xff0c;避免从头开始编写代码。 1. LabVIEW工具网络&#xff08;NI Tools Network&#xff09; …

从准备面试八股文,感悟到技术的本质

工作前几年听说过&#xff0c;大学最重要的几门课其实是数据结构和算法、操作系统、计算机组成原理、计算机网络。 初听时不以为然&#xff0c;感觉没什么用。 近期准备面试八股文得到了一些感悟。这句话随着工作年限和对程序的理解越来越深入&#xff0c;含金量越来越高。 最…

FFmpeg源码:avio_skip函数分析

AVIOContext结构体和其相关的函数分析&#xff1a; FFmpeg源码&#xff1a;avio_r8、avio_rl16、avio_rl24、avio_rl32、avio_rl64函数分析 FFmpeg源码&#xff1a;read_packet_wrapper、fill_buffer函数分析 FFmpeg源码&#xff1a;avio_read函数分析 FFmpeg源码&#xff…

c# Expression<Func<T, T>>转成实体

将 Expression<Func<T, T>>转成实体T public class MyEntity {public int Age { get; set; }public string Name { get; set; } } public static class ExpressionExtension{#region 表达式类型字典/// <summary>/// 表达式类型字典/// </summary>priv…

DVWA-File Inclusion(文件包含)渗透测试

概念&#xff1a; 漏洞产生原因&#xff1a; 主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如&#xff0c;如果一个 Web 应用程序接受用户输入的文件路径&#xff0c;然后使用这个路径进行文件包含&#xff0c;而没有对用户输入进行任何检查&#xff0c…

传输层协议 --- UDP

序言 在之前的文章 Socket 编程 中&#xff0c;我们只是简单的知道了怎么利用 UDP协议 或者是 TCP协议 来发送我们的数据&#xff0c;并且我们还知道 UDP 是不可靠的&#xff0c;TCP 是可靠的。但这是为什么呢&#xff1f;底层的构造和策略决定他们的属性&#xff01;这篇文章中…

数据结构编程实践20讲(Python版)—01数组

本文目录 01 数组 arrayS1 说明S2 举例S3 问题&#xff1a;二维网格中的最小路径求解思路Python3程序 S4 问题&#xff1a;图像左右变换求解思路Python3程序 S5 问题&#xff1a;青蛙过河求解思路Python3程序 写在前面 数据结构是计算机科学中的一个重要概念&#xff0c;用于组…

使用Plotly绘制交互式图表:从入门到精通

使用Plotly绘制交互式图表:从入门到精通 在数据科学和数据可视化领域,交互式图表能够提供更丰富的用户体验和更深入的数据洞察。Plotly 是一个强大的 Python 库,它不仅支持静态图表,还能创建高度交互的图表。本文将详细介绍如何使用 Plotly 实现一个函数来绘制交互式图表,…

【Gitee自动化测试2】Git,Github,Gitlab,Gitee

一. 服务器 与 客户端 是提供服务的计算机&#xff0c;存储项目代码和版本信息&#xff0c;处理客户端请求并返回响应。并通过网络向其他计算机&#xff08;即客户端&#xff09;提供这些服务。服务器可以是物理设备&#xff0c;也可以是虚拟机。 二. 版本控制 目的&#xf…

HttpSession使用方法及原理

HttpSession使用方法及原理 一、HttpSession使用流程说明二、登录概述具体 三、访问过程概述具体 一、HttpSession使用流程说明 1.用户发送登录请求到服务器。 2.服务器处理登录请求&#xff0c;调用userService.login(loginUser)。 3.如果登录成功&#xff0c;服务器调用requ…

Linux云计算 |【第四阶段】NOSQL-DAY2

主要内容&#xff1a; Redis集群概述、部署Redis集群&#xff08;配置manage管理集群主机、创建集群、访问集群、添加节点、移除节点&#xff09; 一、Redis集群概述 1、集群概述 所谓集群&#xff0c;就是通过添加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让…

【echarts】报错series.render is required.

总结&#xff1a;就是echarts无法保存renderItem函数到json里&#xff0c;因为renderItem是个封装方法&#xff0c;因此需要初始化加载时重新插入renderItem即可 1.描述&#xff1a;控制台报错series.render is required. 原数据json如下&#xff1a; {type: "bar"…

‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别

‌Auto-sklearn与scikit-learn的主要区别在于Auto-sklearn是一个自动化机器学习库&#xff0c;而scikit-learn是一个用于数据挖掘和数据分析的Python工具包。‌ Auto-sklearn是一个自动化的机器学习工具&#xff0c;它能够自动搜索最佳的学习算法并优化其超参数&#xff0c;通…

SQLAlchemy 查询,多条件的查询需求,根据传入条件的实际情况,决定将哪些条件作为filter条件进行查询

多个条件的查询&#xff0c;使用 SQLAlchemy 的查询构建器来动态地构建查询&#xff0c;根据传入的条件参数&#xff08;condition1, condition2, condition3 等&#xff09;来决定是否将这些条件添加到查询中 class Order(Base): __tablename__ orders id Column(Integer,…

Python--循环

在Python中&#xff0c;while循环和for循环的语法如下&#xff1a; 1. while循环 while循环会在给定条件为真时重复执行代码块。其基本语法如下&#xff1a; while 条件:# 执行的代码块示例&#xff1a; count 0 while count < 5:print(count)count 12. for循环 for循…

工作安排 - 华为OD统一考试(E卷)

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定…

科研绘图系列:R语言树结构聚类热图(cluster heatmap)

文章目录 介绍加载R包导入数据数据预处理画图修改图形导出数据系统信息介绍 热图结合树结构展示聚类结果通常用于展示数据集中的模式和关系,这种图形被称为聚类热图或层次聚类热图。在这种图中,热图部分显示了数据矩阵的颜色编码值,而树结构(通常称为树状图或聚类树)则显…

AIGAME背后的强大背景与AI币价值的崛起

AIGAME平台背后汇集了强大的资本和技术支持&#xff0c;凭借蒙特加密产业基金的战略投资和汇旺集团的多元化Web3基础设施建设&#xff0c;AIGAME在全球范围内迅速崛起。平台所使用的Sleepless AI技术&#xff0c;结合区块链与AI的深度融合&#xff0c;赋能AI币&#xff0c;使其…