首页 > 编程笔记 > C++笔记 阅读:7

OpenCV imwrite():输出图像到文件(附带实例)

函数 imwrite() 可以用来输出图像到文件,其声明如下:
bool cv::imwrite (const String & filename,  InputArray  img, const std::vector< int > &  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 文件。

相关文章