OpenCV imwrite():输出图像到文件(附带实例)
函数 imwrite() 可以用来输出图像到文件,其声明如下:
通常,使用 imwrite() 函数能保存 8 位单通道或三通道(具有 BGR 通道顺序)图像。16 位无符号(CV_16U)图像可以保存为 PNG、JPEG 2000 和 TIFF 格式。32 位浮点(CV_32F)图像可以保存为 PFM、TIFF、OpenEXR 和 Radiance HDR 格式。三通道(CV_32FC3)TIFF 图像将使用 LogLuv 高动态范围编码(每像素 4 字节)保存。
另外,使用此函数可以保存带有 alpha 通道的 PNG 图像。为此,创建 8 位(或 16 位)四通道图像 BGRA,其中 alpha 通道最后到达。完全透明的像素应该将 alpha 通道设置为 0,完全不透明的像素应该将 alpha 设置为 255/65535。如果格式、深度或通道顺序不同,就在保存之前使用 Mat::convertTo 和 cv::cvtColor 进行转换,或者使用通用文件存储 I/O 函数将图像保存为 XML 或 YAML 格式。
下面示例将演示如何创建 BGRA 图像并将其保存到 PNG 文件中,还将演示如何设置自定义压缩参数。
【实例】创建 BGRA 图像并将其保存到 PNG 文件。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
3) 保存工程并运行,结果如下:
bool cv::imwrite (const String & filename, InputArray img, const std::vector< int > & params = std::vector< int >() );
- filename 表示需要写入的文件名,必须加上后缀,比如 123.png,注意要保存图片为哪种格式,就带什么后缀;
- img 表示 Mat 类型的图像数据,就是要保存到文件中的原图像数据;
- params 表示为特定格式保存的参数编码,它有一个默认值 std::vector< int >(),所以一般情况下不用写。
通常,使用 imwrite() 函数能保存 8 位单通道或三通道(具有 BGR 通道顺序)图像。16 位无符号(CV_16U)图像可以保存为 PNG、JPEG 2000 和 TIFF 格式。32 位浮点(CV_32F)图像可以保存为 PFM、TIFF、OpenEXR 和 Radiance HDR 格式。三通道(CV_32FC3)TIFF 图像将使用 LogLuv 高动态范围编码(每像素 4 字节)保存。
另外,使用此函数可以保存带有 alpha 通道的 PNG 图像。为此,创建 8 位(或 16 位)四通道图像 BGRA,其中 alpha 通道最后到达。完全透明的像素应该将 alpha 通道设置为 0,完全不透明的像素应该将 alpha 设置为 255/65535。如果格式、深度或通道顺序不同,就在保存之前使用 Mat::convertTo 和 cv::cvtColor 进行转换,或者使用通用文件存储 I/O 函数将图像保存为 XML 或 YAML 格式。
下面示例将演示如何创建 BGRA 图像并将其保存到 PNG 文件中,还将演示如何设置自定义压缩参数。
【实例】创建 BGRA 图像并将其保存到 PNG 文件。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
#include "pch.h" #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; static void createAlphaMat(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; // 蓝色 bgra[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // 绿色 bgra[2] = saturate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // 红色 bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha } } } int main() { // Create mat with alpha channel Mat mat(480, 640, CV_8UC4); createAlphaMat(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"); return result ? 0 : 1; }在上述代码中,createAlphaMat() 是一个自定义函数,用于使用 alpha 通道创建材质;compression_params 用于存放压缩参数;函数 imwrite() 把图像矩阵以 compression_params 压缩参数保存到工程目录下的 alpha.png 中,文件 alpha.png 会自动创建。
3) 保存工程并运行,结果如下:
Saved PNG file with alpha data.
此时可以在构建目录下发现有一个 640×480 的 alpha.png 文件。