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.函數
typedef Vec <uchar, 2> Vec2b;
Vec2b—表示每一個Vec2b對象中,能夠存儲2個char(字符型)數據
Vec3b—表示每個Vec3b對象中,能夠存儲3個char(字符型)數據,好比能夠用這樣的對象,去存儲RGB圖像中的
Vec4b—表示每個Vec4b對象中,能夠存儲4個字符型數據,能夠用這樣的類對象去存儲—4通道RGB+Alpha的圖編碼
就是防止數據溢出,具體的原理能夠大體描述以下:
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(); }