学习Opencv-第9节-读写图像

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;

}

效果如下图:

学习Opencv-第9节-读写图像

© 版权声明

相关文章

2 条评论

  • 头像
    奔跑的小矿工 读者

    为什么不用python,python多香啊。

    无记录
    回复
  • 头像
    迷路 读者

    收藏了,感谢分享

    无记录
    回复