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等,前后像素值是一样的。(图片不进行任何处理,只是读-写)。