1、读图像—imread()
Mat imread(const string& filename,ing flags = 1)
定义中包含两个参数,一个图像文件名,一个flag标志位,返回的是一个Mat类
读取失败,则返回空矩阵,即Mat::data的值是Null
这边存在一个容易忽略的点,就是读取图像之后,紧跟其后是使用Mat::empty()函数进行检测文件图片是否读入成功。
参数flag标志的三种情况
(1)flag>0,该函数返回3通道图像,吐过磁盘上的图像文件时单通道的灰度图像,则会被计算机强制转为3通道
(2)flag = 0;该函数返回单通道图像,如果磁盘上的图像文件时多通道的图像,会被计算机强制转位单通道
(3)flag<0,则函数不对图像通道进行转换。
2、imread()支持读入的文件格式:
(1)Windows 位图文件 – BMP, DIB;
(2)JPEG 文件 – JPEG, JPG, JPE;
(3)便携式网络图片 – PNG;
(4)便携式图像格式 – PBM, PGM, PPM;
(5)Sun rasters – SR, RAS;
(6)TIFF 文件 – TIFF, TIF;
(7)OpenEXR HDR 图片 – EXR;
(8)JPEG 2000 图片- jp2
针对以上文件,并非安装了OPencv的库就可以支持,还需要再编译的时候添加对应的库
3、写图像文件 —imwrite()
将操作完的矩阵重新生成图像
原函数定义:
bool imwrite(const string&filename,InputArray image,const vector<ing>¶ms = vector<int>())
参数有文件名,用来决定生成图像的类型及名称,推荐使用PNG格式,这个时无损压缩,BMP时无损格式,一般不压缩,尺寸较大,jpeg文件格式图像大小较小,但是,其时有损压缩
矩阵名,就是待转化的矩阵
第三个参数用来指定生成的图像文件的一些细节信息,这跟第一个参数中指定的图像类型有关系
如下:
(1)jpeg:表明图像的质量,取值从0-100,数值越大表明图像质量越高,当然文件也就越大,默认值是95.
(2)png:表明压缩级别,取值从0-9。数值越大表明压缩等级越高,文件也就越小,同时花费的时间也就越长,默认值为3
(3)ppm,pgm,pbm:表明已二进制化还是纯文本方式存储,取值为0或1,如果取值为1,则表明以二进制方式进行存储。默认为1
注意,并不是所有Mat对象都可以转化为图像文件:
(1)数据类型为8U类型的单通道和多通道矩阵,可以转为任意类型
(2)16U的数据类型,只能保存为PNG,JPEG2000和TIFF格式
(3)其他类型
需要用Mat::converTo()函数或者cvtColor()函数将矩阵转为可以保存的格式
注意,如果保存路径下已经存在一样的图像文件,imwrite()不会提醒,会直接覆盖原来的文件
案例;
int test6()
{
//读取图像,将其转换为单通道,即灰度图
Mat img = imread(“C:\Users\86188\Desktop\526.jpg”,0);
//判断是否读取成功
if (img.empty())
{
cout << “Can not load image!!” << endl;
return -1;
}
// 进行 Canny 操作(提取图像边缘),并将结果存于 result
Mat result;
Canny(img, result, 150, 220);//边缘检测
//保存结果
imwrite(“C:\Users\86188\Desktop\526-canny.png”, result);
imshow(“image”,img);
imshow(“result”, result);
return 0;
}
效果如下图:







为什么不用python,python多香啊。
收藏了,感谢分享