cv::imread()函数读取图片,cv::imwrite()写图片。
imread()支持的图像文件包括:

  • .jpg或.jpeg:以baseline JPEG格式保存;8位数据;单通道或三通道输入;
  • .jp2:JPEG2000;8位或16位数;单通道或三通道输入;
  • .tif或者.tiff:TIFF;8位或16位数据;单通道、三通道或四通道输入;
  • .png:PNG;8位或16位数据;单通道、三通道或四通道输入;
  • .bmp:BMP;8位数据;单通道、三通道或四通道数据;
  • .ppm/.pgm:NetPBM;8为数据;单通道(PGM)或三通道(PPM);

函数原型:

Mat imread(const string& filename, int flags = 1);
bool imwrite(const string& filename, InputArray image, const vector<int>& params = vector(int>());

参数flags可取的值如下:

标志

含义

cv::IMREAD_COLOR

总是读取三通道图像,默认值

cv::IMREAD_GRAYSCALE

总是读取单通道图像

cv::IMREAD_ANYCOLOR

通道数由文件实际通道数(不超过3)

cv::IMREAD_ANYDEPTH

允许加载超过8bit深度

cv::IMREAD_UNCHANGED

等于将cv::IMREAD_ANYCOLOR和cv::IMREAD_ANTDEPTH组合了起来,但也不是完全恰当,该设置会保存alpha通道

imwrite()的第三个参数params被用作页数类型文件的写入操作时所需的数据。输入参数为内部为整型数据的一个STL vector,vector中的整型序列的具体内容为:一系列的参数ID以及与该参数对应的参数值,每个参数ID之后跟着其对应的值,如下是OpenCV为这些参数ID起的别名以及取值范围:

标志

含义

取值范围

默认值

cv::IMWRITE_JPG_QUALITY

JPEG的质量,值越大,质量越高

0-100

95

cv::IMWRITE_PNG_COMPRESSION

PNG压缩值,更高的值意味着更多的压缩

0-9

3

cv::IMWRITE_PXM_BINARY

对PPM,PGM或PBM文件是否使用二值格式

0或1

1

示例代码:

#include "stdafx.h"

#include <opencv2/highgui/highgui.hpp>

int _tmain(int argc, _TCHAR* argv[])
{
	std::string filename = "test.bmp";
	cv::Mat img = cv::imread(filename, 1);
	if (!img.empty()){
		cv::namedWindow("test", cv::WINDOW_NORMAL);
		cv::imshow("test", img);
		cv::waitKey(0);
		cv::destroyWindow("test");
	}
	else{
		printf("读取图片失败!");
	}


	if (!cv::imwrite("test1.bmp", img)){
		printf("保存图片失败!");
	}

	return 0;
}

使用过程中遇到的问题:

1. cv::imread()读取的bmp图像顺序是BGR。

2. 有时会出现cv::imread()函数读取的图片为空,可能的原因:

  •   传入的路径有问题,此时需要检查传入的图片路径,建议是绝对路径,并且路径中不要有中文;
  • 链接库有问题,debug和release编译时要加载对应的链接库(debug:opencv_xxxxd.lib;release:opencv_xxxx.lib)

3. 使用cv::imread()和cv::imwrite()操作同一张图片,对于需要压缩的图片类型,前后的像素值可能会有差异,对于不压缩的图片类型比如bmp/png等,前后像素值是一样的。(图片不进行任何处理,只是读-写)。