当前位置: 首页 > 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.
http://www.lryc.cn/news/447190.html

相关文章:

  • JVM(HotSpot):方法区(Method Area)
  • JWT的基础与使用
  • 处理 VA02修改行项目计划行(SCHEDULE LINES )报错:不可能确定一个消耗帐户
  • 【AI基础】pytorch lightning 基础学习
  • 高通量测序技术--组蛋白甲基化修饰、DNA亲和纯化测序,教授(优青)团队指导:从实验设计、结果分析到SCI论文辅助
  • [极客大挑战 2019]RCE ME1
  • 计算机毕业设计 中医院问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • FME辅助规划选址
  • Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.
  • 实战篇 | WSL迁移Linux系统到非系统盘(完整实操版)
  • 增量式编码器实现原理
  • 数据集-目标检测系列-口罩检测数据集 mask>> DataBall
  • 工作安排 - 华为OD统一考试(E卷)
  • STM32 GPIO - 笔记
  • 三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码
  • Linux下的基本指令/命令(二)
  • CentOs-Stream-9 设置静态IP外网访问
  • 精密制造的革新:光谱共焦传感器与工业视觉相机的融合
  • 边缘计算与 Python Web 应用:从理论到实践
  • 华为OD机试真题------分糖果
  • Kotlin:变量声明,null安全,条件语句,函数,类与对象
  • C--结构体和位段的使用方法
  • 卷积神经网络-迁移学习
  • 数据库:PL/SQL
  • 迅雷笔试 最长相等子段数列长度 滑动窗口
  • MMD模型一键完美导入UE5-VRM4U插件方案(一)
  • bench.sh:一行命令测试Linux服务器基准测试
  • 广播IP与共享IP的关系
  • 正则表达式和re模块
  • 不同的浏览器、服务器和规范对 URL 长度的限制