1、读写图像文件

将图像文件读入内存,可以使用 imread()函数;将 Mat 对象以图像文件格式写入内存,可以使用 imwrite()函数。

1.1、读取图像文件

imread()函数返回的是 Mat 对象,如果读取文件失败,则会返回一个空矩阵,即Mat::data 的值是 NULL。执行 imread()之后,需要检查文件是否成功读入,你可以使用 Mat::empty()函数进行检查。

  • imread()函数的声明如下:
Mat imread(const string& filename, int flags=1)
  • 很明显参数 filename 是被读取或者保存的图像文件名;
    在 imread()函数中,flag 参数值有三种情况:
    1. flag>0,该函数返回3 通道图像,如果磁盘上的图像文件是单通道的灰度图像,则会被强制转为 3 通道;
    2. flag=0,该函数返回单通道图像,如果磁盘的图像文件是多通道图像,则会被强制转为单通道;
    3. flag<0,则函数不对图像进行通道转换。
  • 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 并不一定能支持上述所有格式,文件格式的支持需要特定的库,只有在编译 OpenCV 添加了相应的文件格式库,才可支持其格式。

1.2、写图像文件

将图像写入文件,可使用 imwrite()函数

  • 该函数的声明如下:
bool imwrite(const string& filename, InputArray image,const vector<int>& params=vector<int>())

参数:

  1. 文件的格式由 filename 参数指定的文件扩展名确定。
  1. BMP 格式是无损格式,但是一般不进行压缩,文件尺寸非常大;
  2. JPEG 格式的文件较小,但是 JPEG 是有损压缩,会丢失一些信息。
  3. PNG 是无损压缩格式,推荐使用。
  1. 第三个参数 params 可以指定文件格式的一些细节信息。这个参数里面的数值是跟文件格式相关的:
  1. JPEG:表示图像的质量,取值范围从 0 到 100。数值越大表示图像质量
    越高,当然文件也越大。默认值是 95。
  2. PNG:表示压缩级别,取值范围是从 0 到 9。数值越大表示文件越小,
    但是压缩花费的时间也越长。默认值是 3。
  3. PPM,PGM 或 PBM:表示文件是以二进制还是纯文本方式存储,取值为
    0 或 1。如果取值为 1,则表示以二进制方式存储。默认值是 1。
  • 并不是所有的 Mat 对象都可以存为图像文件,目前支持的格式只有 8U 类型的单通道和 3 通道(颜色顺序为 BGR)矩阵;
    如果需要要保存 16U 格式图像,只能使用 PNG、JPEG 2000 和 TIFF 格式。
    如果希望将其他格式的矩阵保存为图像文件,可以先用 Mat::convertTo()函数或者 cvtColor()函数将矩阵转为可以保存的格式。
    另外需要注意的是,在保存文件时,如果文件已经存在,imwrite()函数不会
    进行提醒,将直接覆盖掉以前的文件
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{

    //读入图像,并将之转为单通道图像
	Mat im = imread("D:\\2.jpg", 1);
	//namedWindow("yuan", WINDOW_AUTOSIZE);//窗户的标志。支持的标志是:(cv :: WindowFlags)
	imshow("自拍原图", im);
	//请一定检查是否成功读图
	if (im.empty())
	{
		cout << "Can not load image." << endl;
		return -1;
	}

	//进行 Canny 操作,并将结果存于 result
	Mat result;
	Canny(im, result, 50, 150);

	//保存结果
	imwrite("canny.png", result);
	imshow("我的自拍", result);
	waitKey(0);
	return 0;
}

opencv imread 4通道 opencv中imread怎么用_取值范围