OpenCV:imwrite函数保存图片

imwrite函数功能:用于将图像保存到指定的文件,可以为各种格式的图像。

函数原型:

bool cv::imwrite(const String & filename,
InputArray img,
const std::vector<int> & params = std::vector<int>() 
)	

函数参数:

  • filename:需要保存图像的文件名,要保存图片为哪种格式,就带什么后缀。
  • img:要保存的图像。
  • params:表示为特定格式保存的参数编码。

注意

imwrite函数是基于文件扩展名选择图像的格式。通常,使用此功能只能保存8位单通道或3通道(带有BGR通道顺序)图像,但有以下例外:

  • 对于PNG,JPEG2000和TIFF格式,可以保存16位无符号(CV_16U)图像。
  • 32位浮点(CV_32F)图像可以保存为PFM,TIFF,OpenEXR和Radiance HDR格式; 使用LogLuv高动态范围编码(每像素4个字节)保存3通道(CV_32FC3)TIFF图像
  • 可以使用此功能保存带有Alpha通道的PNG图像。为此,创建8位(或16位)4通道图像BGRA,其中alpha通道最后。完全透明的像素应该将alpha设置为0,完全不透明的像素应该将alpha设置为255/65535。

如果格式,深度或通道顺序不同,请在保存之前使用Mat :: convertTocv :: cvtColor进行转换。或者,使用通用FileStorage I / O函数将图像保存为XML或YAML格式。

编码参数:

IMWRITE_JPEG_QUALITY 

Python:cv.IMWRITE_JPEG_QUALITY

对于JPEG,它可以是从0到100的质量(越高越好)。默认值为95。

IMWRITE_JPEG_PROGRESSIVE 

Python:cv.IMWRITE_JPEG_PROGRESSIVE

启用JPEG功能,0或1,默认为False。

IMWRITE_JPEG_OPTIMIZE 

Python:cv.IMWRITE_JPEG_OPTIMIZE

启用JPEG功能,0或1,默认为False。

IMWRITE_JPEG_RST_INTERVAL 

Python:cv.IMWRITE_JPEG_RST_INTERVAL

JPEG重启间隔,0 - 65535,默认为0 - 无重启。

IMWRITE_JPEG_LUMA_QUALITY 

Python:cv.IMWRITE_JPEG_LUMA_QUALITY

单独的亮度质量等级,0 - 100,默认为0 - 不使用。

IMWRITE_JPEG_CHROMA_QUALITY 

Python:cv.IMWRITE_JPEG_CHROMA_QUALITY

单独的色度质量等级,0 - 100,默认为0 - 不使用。

IMWRITE_PNG_COMPRESSION 

Python:cv.IMWRITE_PNG_COMPRESSION

对于PNG,它可以是从0到9的压缩级别。值越高意味着更小的尺寸和更长的压缩时间。如果指定,则策略更改为IMWRITE_PNG_STRATEGY_DEFAULT(Z_DEFAULT_STRATEGY)。默认值为1(最佳速度设置)。

IMWRITE_PNG_STRATEGY 

Python:cv.IMWRITE_PNG_STRATEGY

其中一个品种:: ImwritePNGFlags,默认为IMWRITE_PNG_STRATEGY_RLE。

IMWRITE_PNG_BILEVEL 

Python:cv.IMWRITE_PNG_BILEVEL

二进制级别PNG,0或1,默认为0。

IMWRITE_PXM_BINARY 

Python:cv.IMWRITE_PXM_BINARY

对于PPM,PGM或PBM,它可以是二进制格式标志,0或1.默认值为1。

IMWRITE_EXR_TYPE 

Python:cv.IMWRITE_EXR_TYPE

 
IMWRITE_WEBP_QUALITY 

Python:cv.IMWRITE_WEBP_QUALITY

覆盖EXR存储类型(默认为FLOAT(FP32))

对于WEBP,它可以是1到100的质量(越高越好)。默认情况下(不带任何参数),如果质量高于100,则使用无损压缩。

IMWRITE_PAM_TUPLETYPE 

Python:cv.IMWRITE_PAM_TUPLETYPE

对于PAM,将TUPLETYPE字段设置为为格式定义的相应字符串值。

IMWRITE_TIFF_RESUNIT 

Python:cv.IMWRITE_TIFF_RESUNIT

对于TIFF,用于指定要设置的DPI分辨率单位; 请参阅libtiff文档以获取有效值。

IMWRITE_TIFF_XDPI 

Python:cv.IMWRITE_TIFF_XDPI

对于TIFF,用于指定X方向DPI。

IMWRITE_TIFF_YDPI 

Python:cv.IMWRITE_TIFF_YDPI

对于TIFF,用于指定Y方向DPI。

IMWRITE_TIFF_COMPRESSION 

Python:cv.IMWRITE_TIFF_COMPRESSION

对于TIFF,用于指定图像压缩方案。请参阅libtiff以获取与压缩格式对应的整数常量。注意,对于深度为CV_32F的图像,仅使用libtiff的SGILOG压缩方案。对于其他支持的深度,可以通过此标志指定压缩方案; LZW压缩是默认值。

IMWRITE_JPEG2000_COMPRESSION_X1000 

Python:cv.IMWRITE_JPEG2000_COMPRESSION_X1000

对于JPEG2000,用于指定目标压缩率(乘以1000)。该值可以是0到1000.默认值是1000。

示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
	cv::Mat srcImage;
	//加载图像
	srcImage = cv::imread("image.jpg",1);
	if (srcImage.empty())
	{
		std::cout << "图像加载失败!" << std::endl;
		return -1;
	}
	cv::imshow("主窗口", srcImage);
	//保存图像到当前项目
	cv::imwrite("save.jpg", srcImage);
	cv::waitKey(0);
	//销毁所有窗口
	cv::destroyAllWindows();
	return 0;
}

代码结果:

 

 

 

<think>好的,我需要回答用户关于OpenCV的cv::imwrite函数是否支持保存YUYV格式图像的问题。首先,我需要回忆一下OpenCV的文档相关知识。 记得OpenCV在处理图像时,通常使用BGR或RGB的像素格式,而像YUV这样的色彩空间可能需要转换。cv::imwrite函数保存图片的格式取决于文件扩展名,比如.jpg、.png等,但内部处理时会根据图像的编码格式来保存。不过,YUYV是一种特定的像素格式,属于YUV422的一种打包方式,每个像素点共享色度分量。 接下来,我需要确认cv::imwrite支持的图像格式。根据引用[3],它提到const std::vector<int>可能涉及图像编码参数,参考cv::ImwriteFlags。通常,保存图像时,OpenCV会自动转换颜色空间为BGR,除非使用特定参数。例如,当使用cv::imwrite保存图像时,如果原始图像是YUV格式,可能需要先转换为BGR,否则可能会出现错误或者不正确的保存结果。 用户提供的引用[2]中,展示了使用FFmpegOpenCV转换YUYV422到BGR,并保存为JPEG。这说明直接保存YUYV可能需要先转换。另外,引用[1]中的代码将图像转换为YUV格式,但获取的是每个像素的YUV分量,而保存时可能需要转换回BGR。 因此,推测cv::imwrite默认不支持直接保存YUYV格式的图像,因为大多数图像格式如JPEG、PNG等通常使用RGB或YCbCr(类似YUV但不是YUYV打包格式)。如果用户想要保存YUYV原始数据,可能需要以原始二进制格式保存,而不是通过imwrite,因为imwrite会进行编码处理,可能导致格式转换。 总结:cv::imwrite不支持直接保存YUYV格式的图像,需要先转换为支持的格式如BGR,或者保存为原始数据文件。</think>### 逐步解答 1. **理解YUYV格式特性** YUYV(又称YUV422)是一种打包格式,每两个水平相邻的像素共享色度分量(UV)。其存储方式为:`Y0 U0 Y1 V0`,每个像素占2字节。这种格式常用于视频采集传输,但标准图像文件(如JPEG、PNG)通常不直接支持该格式。 2. **确认`cv::imwrite`的功能限制** OpenCV的`cv::imwrite`函数主要用于保存编码后的图像文件(如JPEG、PNG),其输入图像矩阵的格式需为**BGR或RGB**(8/16)[^3]。若直接传入YUYV格式的`cv::Mat`,函数会尝试自动转换色彩空间,可能导致数据异常或保存失败。 3. **验证保存YUYV的可行性** - **错误示例**: ```cpp cv::Mat yuyvImage; // 假设为YUYV格式的Mat cv::imwrite("output.jpg", yuyvImage); // 输出结果可能颜色失真或报错 ``` 此时,OpenCV会将YUYV数据错误地解释为BGR,导致图像颜色错误。 - **正确方法**: 需先将YUYV转换为BGR再保存(参考引用[2]的转换逻辑): ```cpp cv::Mat yuyvImage; // 原始YUYV数据 cv::Mat bgrImage; cv::cvtColor(yuyvImage, bgrImage, cv::COLOR_YUV2BGR_YUYV); // 转换为BGR cv::imwrite("output.jpg", bgrImage); // 正常保存 ``` 4. **替代方案:保存原始YUV数据** 若需保留原始YUYV数据,可将其写入二进制文件(而非通过`cv::imwrite`): ```cpp std::ofstream file("raw.yuv", std::ios::binary); file.write(reinterpret_cast<char*>(yuyvImage.data), yuyvImage.total() * yuyvImage.elemSize()); ``` ### 结论 `cv::imwrite` **不支持直接保存YUYV格式的图像**。需通过以下方式处理: 1. **转换为BGR/RGB后保存**(适用于标准图像文件) 2. **保存为原始二进制文件**(保留YUYV原始数据) --- ### 相关问题 1. 如何在OpenCV中正确转换YUV422到BGR格式? 2. 使用`cv::imwrite`保存图像时出现颜色失真,可能是什么原因? 3. OpenCV支持哪些YUV子格式的转换?
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值