ex1:
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;int main()
{
Mat imgsrc = imread("lena.jpg",0);
if(imgsrc.data == NULL) return -1;
//cout<<imgsrc.channels()<<endl;
namedWindow("my",WINDOW_AUTOSIZE);
imshow("my",imgsrc);
imwrite("my.jpg",imgsrc);
waitKey(0);
destroyWindow("my");
imgsrc.release();
return 0;
}
首先来看看imwrite()函数的具体用法。
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() )
该函数是把程序中的Mat类型的矩阵保存为图像到指定位置。
参数filename为所需保存图像的文件目录和文件名。这里的文件名需要带有图像格式后缀的,目前OpenCV该函数只支持JPEG,PNG,PPM,PGM,PBM,TIFF等。并不是所有Mat类型都支持。
img参数为图像数据来源,其类型为Mat。注意也不是所有格式的Mat型数据都能被使用保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U)。所以其他一些数据类型是不支持的,比如说float型等。如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor()函数来进行转换。convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。而cvtColor()函数是负责转换不同通道的Mat,因为该函数的第4个参数就可以设置目的Mat数据的通道数(只是我们一般没有用到它,一般情况下这个函数是用来进行色彩空间转换的)。另外也可以不用imwrite()函数来存图片数据,可以直接用通用的XML IO接口函数将数据存在XML或者YXML中。
paramValue_1, paramId_2, paramValue_2, ... 也就是说存入一对属性值。如果不设置该参数的话,则程序会自动根据所保存的图像格式采用一个默认的参数。
这里主要就是用到了 imwrite("要存的图像名字.格式",imgsrc,para),主要讲一下这个para,它是个vector<int>类型。这个参数有三种,可以是:
1、JPEG,参数为CV_IMWRITE_JPEG_QUALITY,它的值是从0到100,值越小压缩的越多,默认值是95.
2、PNG,参数为CV_IMWRITE_PNG_COMPRESSION,它的值是从0到9,值越大表示图片尺寸越小,压缩时间越长。默认值是3。
3、PPM,PGM或者PBM,参数为CV_IMWRITE_PXM_BINARY,它的值是0或者1。默认值是1。
ex2:
#include<opencv2/opencv.hpp>
#include<vector>
using namespace cv;
using namespace std;int main()
{
Mat imgsrc = imread("lena.jpg",0);
if(imgsrc.data == NULL) return -1;
//cout<<imgsrc.channels()<<endl;
namedWindow("my",WINDOW_AUTOSIZE);
imshow("my",imgsrc);vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
imwrite("my.jpg",imgsrc,compression_params);
waitKey(0);
destroyWindow("my");
imgsrc.release();
return 0;
}