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; // Blue
bgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green
bgra[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Red
bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha
}
}
}
int main()
{
Mat mat(480, 640, CV_8UC4); // Create a matrix with alpha channel
paintAlphaMat(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");
else
printf("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.