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