1_OpenCV读写图片

本文详细介绍了OpenCV库中的cv::imread()和cv::imwrite()函数的用法,涵盖了不同图像格式的支持、参数flags的选择,以及在实际操作中可能遇到的问题,如BGR颜色顺序、空图片读取和像素值变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_QUALITYJPEG的质量,值越大,质量越高0-10095
cv::IMWRITE_PNG_COMPRESSIONPNG压缩值,更高的值意味着更多的压缩0-93
cv::IMWRITE_PXM_BINARY对PPM,PGM或PBM文件是否使用二值格式0或11

示例代码:

#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)

参考链接:cv::imread读不出图片的解决办法_xueluowutong的博客-优快云博客_cv.imread读不到

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值