OpenCV之imwrite
技術標籤:javaopencvpythonoracle計算機視覺
1、imwrite
imwrite函式用於將影象儲存到指定的檔案。
CV_EXPORTS_W bool imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
1、filename儲存路徑
2、源影象
3、第三個引數: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.
2、Vec4b
typedef Vec <uchar, 2> Vec2b;
Vec2b—表示每個Vec2b物件中,可以儲存2個char(字元型)資料
Vec3b—表示每一個Vec3b物件中,可以儲存3個char(字元型)資料,比如可以用這樣的物件,去儲存RGB影象中的
Vec4b—表示每一個Vec4b物件中,可以儲存4個字元型資料,可以用這樣的類物件去儲存—4通道RGB+Alpha的圖
3、saturate_cast
就是防止資料溢位,具體的原理可以大致描述如下:
if(data<0)
data=0;
if(data>255)
data=255
例項:
pResultData[j]= cv::saturate_cast<uchar>(255 - pSrcData[j]);
4、 例子

#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();
}
