1. 程式人生 > >OpenCV學習筆記(八):OpenCV使用imwrite儲存4通道圖片(僅對png有效)

OpenCV學習筆記(八):OpenCV使用imwrite儲存4通道圖片(僅對png有效)

轉載OpenCV官方文件中imwrite函式的說明,如何儲存4通道的影象。

轉載地址

https://www.docs.opencv.org/2.4.13/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite#imwrite

內容

Saves an image to a specified file.

C++: bool imwrite(const string& filename, InputArray img, const vector<int>& params

=vector<int>() )

Python: cv2.imwrite(filename, img[, params]) → retval

C: int cvSaveImage(const char* filename, const CvArr* image, const int* params=0 )

Python: cv.SaveImage(filename, image) → None

Parameters:
  • filename – Name of the file.
  • image – Image to be saved.
  • params –

    Format-specific save parameters encoded as pairs paramId_1, paramValue_1, paramId_2,paramValue_2, ... . The following parameters are currently supported:

    • For JPEG, it can be a quality ( CV_IMWRITE_JPEG_QUALITY ) from 0 to 100 (the higher is the better). Default value is 95.
    • For PNG, it can be the compression level ( CV_IMWRITE_PNG_COMPRESSION ) from 0 to 9. A higher value means a smaller size and longer compression time. Default value is 3.
    • For PPM, PGM, or PBM, it can be a binary format flag ( CV_IMWRITE_PXM_BINARY ), 0 or 1. Default value is 1.

The function imwrite saves the image to the specified file. The image format is chosen based on the filenameextension (see imread() for the list of extensions). Only 8-bit (or 16-bit unsigned (CV_16U) in case of PNG, JPEG 2000, and TIFF) single-channel or 3-channel (with ‘BGR’ channel order) images can be saved using this function. If the format, depth or channel order is different, use Mat::convertTo() , and cvtColor() to convert it before saving. Or, use the universal FileStorage I/O functions to save the image to XML or YAML format.

It is possible to store PNG images with an alpha channel using this function. To do this, create 8-bit (or 16-bit) 4-channel image BGRA, where the alpha channel goes last. Fully transparent pixels should have alpha set to 0, fully opaque pixels should have alpha set to 255/65535. The sample below shows how to create such a BGRA image and store to PNG file. It also demonstrates how to set custom compression parameters

大致含義

imwrite函式只支援儲存8位(或16位無符號)的單通道或者三通道(BGR)影象為PNG、JPEG 2000、TIFF格式的影象檔案。其他格式的影象要麼轉化為以上的格式,要麼使用FileStorage提供的方法儲存為XML或YAML檔案。

程式碼

#include <vector>
#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

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; // 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(int argv, char **argc)
{
    // Create mat with alpha channel
    Mat mat(480, 640, CV_8UC4);
    createAlphaMat(mat);

    vector<int> compression_params;
    compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);

    try {
        imwrite("alpha.png", mat, compression_params);
    }
    catch (runtime_error& ex) {
        fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
        return 1;
    }

    fprintf(stdout, "Saved PNG file with alpha data.\n");
    return 0;
}