一、基本介绍
imwrite函数在OpenCV中是用于将图像写入文件的函数。该函数接收两个参数:文件名和要写入文件的图像。这个函数可以自动检测文件类型,从而创建适当的文件格式。
使用imwrite函数,可以将处理过的图像输出并保存到硬盘上,以供后续的分析和应用。这在图像处理、计算机视觉、机器学习和深度学习领域中经常用到。
二、文件类型
imwrite函数支持多种图像文件类型,包括JPEG、PNG、TIFF、BMP、PPM、PGM等。在文件名中设置图像格式时,需要按照以下格式进行设置:
Mat image;
...
// 输出为PNG格式
imwrite("output.png", image);
// 输出为JPEG格式
imwrite("output.jpg", image);
// 输出为TIFF格式
imwrite("output.tiff", image);
三、压缩级别
imwrite函数的第三个可选的参数为压缩级别的选项。这个选项的值越小,输出的文件大小就越小,但是图像的质量也会受到影响。
在OpenCV中压缩级别的取值可以为0到9之间的任意整数。默认情况下,压缩级别设置为3。可以通过下面的代码设置不同的压缩级别:
Mat image;
...
// 压缩级别为0,文件大小最小,但图像质量较低
imwrite("output.jpg", image, compression_params(0));
// 压缩级别为9,文件大小最大,但图像质量最高
imwrite("output.jpg", image, compression_params(9));
// 压缩级别为3,既不会影响图像质量,也不会增加文件大小
imwrite("output.jpg", image, compression_params(3));
四、输出参数
imwrite函数的返回值为bool类型。如果文件写入操作成功,则返回true;否则返回false。
在实际工程中,我们需要经常检测图像文件是否有成功写入,可以通过返回值来进行筛选。下面是一个简单的例子:
Mat image;
...
if (!imwrite("output.jpg", image)) {
cout << "写入文件失败!" << endl;
}
五、代码示例
下面是一个完整的代码示例:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
if (argc != 2) {
cout << "The image filename is not specified!" << endl;
return -1;
}
Mat img = imread(argv[1], IMREAD_GRAYSCALE);
if (img.empty()) {
cout << "Failed to open image: " << argv[1] << endl;
return -1;
}
string output_filename = "output.png";
vector<int> compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
if (!imwrite(output_filename, img, compression_params)) {
cout << "Failed to save image: " << output_filename << endl;
return -1;
}
cout << "Output file is saved: " << output_filename << endl;
return 0;
}
在上面的代码中,我们读入了一张灰度图像,然后将它以PNG格式进行压缩。通过将压缩参数设置为9,我们最大程度地保证了输出图像的质量。最后,我们在控制台输出了写入文件的状态。
