📅  最后修改于: 2023-12-03 14:44:54.354000             🧑  作者: Mango
OpenCV是一个开源的计算机视觉库,允许使用C++、Python、Java等多种编程语言进行编程,其中包含了很多计算机视觉相关的操作,包括图像处理、图像识别、目标检测等。
在OpenCV中,存储图像也是一项非常重要的操作。本篇文章将向您介绍如何在OpenCV中存储图像,并提供一些示例代码帮助您更好地理解这一过程。
在OpenCV中,可以使用imwrite()函数将图像保存到硬盘上。该函数提供了多种图像格式的支持,包括bmp、jpeg、png等。
bool imwrite ( const string &filename, InputArray img, const vector<int> ¶ms = vector<int>() );
其中,filename是要保存的文件名,img是要保存的图像矩阵,params是保存选项。
示例代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("test.jpg");
imwrite("new_image.jpg", image);
return 0;
}
在这个例子中,我们使用imread()函数将test.jpg图像读入到内存中,然后使用imwrite()函数将该图像保存为new_image.jpg。
除了上述示例代码中使用的默认参数外,imwrite()函数还可以提供一些选项以便更好地控制保存结果。
在保存图像时,可以使用一个名为params的可选参数列表来传递保存选项。该参数需要使用一个vector
示例代码:
vector<int> params;
params.push_back(IMWRITE_JPEG_QUALITY);
params.push_back(100);
imwrite("new_image.jpg", image, params);
在这个例子中,我们使用IMWRITE_JPEG_QUALITY选项来指定JPEG图像的质量。该选项指定的值类型为int,可以在0到100之间取值。0表示最低质量,100则表示最高质量。
上述代码将JPEG图像质量设定为100,并保存到硬盘上。同样,我们还可以使用其他的选项来控制保存结果。
对于JPEG格式的图像,可以使用以下的保存选项:
IMWRITE_JPEG_QUALITY:指定保存JPEG图像的质量。取值范围为0到100,默认值为95。
IMWRITE_JPEG_PROGRESSIVE:指定JPEG图像是否为渐进式。如果该值为1,则指定为渐进式;否则,指定为非渐进式。默认值为0。
IMWRITE_JPEG_OPTIMIZE:指定JPEG图像是否进行优化。如果该值为1,则对图像进行优化;否则,不对图像进行优化。默认值为0。
IMWRITE_JPEG_RST_INTERVAL:指定每个重启间隔使用的DCT系数数量。该值越小,则图像文件大小越小,但图像质量可能会下降。默认值为0(表示没有重启)。
IMWRITE_JPEG_LUMA_QUALITY:指定亮度的压缩质量。取值范围为0到100。默认值为0。
IMWRITE_JPEG_CHROMA_QUALITY:指定色度的压缩质量。取值范围为0到100。默认值为0。
对于PNG格式的图像,可以使用以下的保存选项:
IMWRITE_PNG_COMPRESSION:指定PNG图像的压缩级别。取值范围为0到9,0表示没有压缩(文件最大),9表示最大压缩(文件最小)。默认值为1。
IMWRITE_PNG_STRATEGY:指定PNG压缩策略。可以选择3种选项:
IMWRITE_PNG_STRATEGY_DEFAULT:默认压缩策略。该选项可以产生最快的压缩速度。
IMWRITE_PNG_STRATEGY_FILTERED:使用过滤器来进行压缩,以便产生更好的压缩结果。
IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY:只使用霍夫曼编码进行压缩。
IMWRITE_PNG_BILEVEL:当该值为1时,将PNG格式转换为1位的二值图像。默认值为0。
IMWRITE_PNG_STRATEGY_FIXED:指定使用固定的压缩策略。
下面提供一个示例代码,展示如何使用不同的选项保存图像。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("test.jpg");
// 保存为JPEG图像,并指定质量为100
vector<int> params_jpeg;
params_jpeg.push_back(IMWRITE_JPEG_QUALITY);
params_jpeg.push_back(100);
imwrite("new_image.jpg", image, params_jpeg);
// 保存为非渐进式JPEG图像,使用优化,并设置重启间隔
vector<int> params_jpeg_optimize_progressive;
params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_QUALITY);
params_jpeg_optimize_progressive.push_back(95);
params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_PROGRESSIVE);
params_jpeg_optimize_progressive.push_back(0);
params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_OPTIMIZE);
params_jpeg_optimize_progressive.push_back(1);
params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_RST_INTERVAL);
params_jpeg_optimize_progressive.push_back(10);
imwrite("new_image_optimize_progressive.jpg", image, params_jpeg_optimize_progressive);
// 保存为渐进式JPEG图像,并指定重启间隔
vector<int> params_jpeg_progressive;
params_jpeg_progressive.push_back(IMWRITE_JPEG_QUALITY);
params_jpeg_progressive.push_back(95);
params_jpeg_progressive.push_back(IMWRITE_JPEG_PROGRESSIVE);
params_jpeg_progressive.push_back(1);
params_jpeg_progressive.push_back(IMWRITE_JPEG_RST_INTERVAL);
params_jpeg_progressive.push_back(10);
imwrite("new_image_progressive.jpg", image, params_jpeg_progressive);
// 保存为PNG图像,并指定压缩级别
vector<int> params_png;
params_png.push_back(IMWRITE_PNG_COMPRESSION);
params_png.push_back(9);
imwrite("new_image.png", image, params_png);
return 0;
}
在这个示例中,我们首先使用默认选项保存图像为new_image.jpg。然后,我们使用不同的选项保存图像为JPEG和PNG格式,并设置不同的选项,以便更好地控制保存结果。