OpenCV之imwrite

一、imwrite

imwrite函數用於將圖像保存到指定的文件。
 CV_EXPORTS_W bool imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());  
一、filename保存路徑
二、源圖像
三、第三個參數:const std::vector<int>&類型的params,表示爲特定格式保存的參數編碼,它有默認值std::vector<int>(),因此通常狀況下不須要填寫。若是更改的話,對於不一樣的圖片格式,其對應的值不一樣功能不一樣,以下:
對於JPEG格式的圖片,這個參數表示從0-100的圖片質量(CV_IMWRITE_JPEG_QUALITY),默認值是95.
對於PNG格式的圖片,這個參數表示壓縮級別(CV_IMWRITE_PNG_COMPRESSION)從0-9.較高的值意味着更小的尺寸和更長的壓縮時間而默認值是3.
對於PPM,PGM或PBM格式的圖片,這個參數表示一個二進制格式標誌(CV_IMWRITE_PXM_BINARY),取值爲0或1,而默認值爲1.函數

二、Vec4b
 

typedef Vec <uchar, 2> Vec2b; 
Vec2b—表示每一個Vec2b對象中,能夠存儲2個char(字符型)數據 
Vec3b—表示每個Vec3b對象中,能夠存儲3個char(字符型)數據,好比能夠用這樣的對象,去存儲RGB圖像中的 
Vec4b—表示每個Vec4b對象中,能夠存儲4個字符型數據,能夠用這樣的類對象去存儲—4通道RGB+Alpha的圖編碼

三、saturate_cast


就是防止數據溢出,具體的原理能夠大體描述以下:
if(data<0)
        data=0;
if(data>255)
data=255
實例:
 pResultData[j]= cv::saturate_cast<uchar>(255 - pSrcData[j]);spa

 

四、 例子

#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;

void createAlphaMat(Mat &mat)
{
    for(int i = 0; i < mat.rows; ++i)
    {
        for(int j = 0; j < mat.cols; ++j)
        {
            Vec4b &rgba = mat.at<Vec4b>(i, j); //每個Vec4b對象中,能夠存儲4個字符型數據,能夠用這樣的類對象去存儲—4通道RGB+Alpha的圖
            rgba[0] = UCHAR_MAX;
            rgba[1] = saturate_cast<uchar>((float (mat.cols - j))/ ((float)mat.cols) * UCHAR_MAX);
            rgba[2] = saturate_cast<uchar>((float (mat.rows - j))/ ((float)mat.rows) * UCHAR_MAX);
            rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
       }
    }
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //建立帶Alpha通道的Mat
    Mat mat(480, 640, CV_8UC4);
    createAlphaMat(mat);

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

    try{
        imwrite("Alpha.png", mat, compression_params);
        imshow("created png", mat);
        fprintf(stdout, "PNG圖片文件的alpha數據保存完畢!能夠在工程目錄下查看\n");
         waitKey(0);
    }catch(runtime_error & ex){
        fprintf(stderr, "圖像轉換成gng格式發生錯誤", ex.what());
        return 1;
    }

    return a.exec();
}
相關文章
相關標籤/搜索