一、图像的写入操作
1. imwrite函数写入图像
在OpenCV中如果需要将结果图像保存下来,是通过调用imwrite函数来处理:
依赖的头文件
#include <opencv2/imgcodecs.hpp>
CPP:
bool cv::imwrite(const String &filename,InputArray img,
const std::vector< int > & params = std::vector< int >())
Python:
retval=cv.imwrite(filename,img[,params])
filename:保存图片的指定路径
img:待保存的图像数据
params:成对出现的特定格式参数
NOTE:
- 该函数会将Mat类举证的保存成图像文件,其中函数的返回值为bool类型,如果返回true表示图像保存成功,反之则表示图像保存失败;
- 保存的图像的格式,是由第一个参数中的文件扩展名控制;比如说“.//01.bmp”,则保存的图片为bmp格式的图像;
- 通常情况下,该函数保存的图像都是8位单通道和3通道彩色图像,但是下列格式的图像有所区别:
- 16为无符号(CV_16U)图像通常可以保存成PNG、JPEG、TIFF格式的文件;
- 32位浮点型(CV_32F)图像可以保存为PFM、TIFF、OpenEXR和Radiance HDR格式文件;
- 4通道(Alpha通道)图像可以保存为PNG格式的文件。
- 如果需要保存的图像的不满足上述保存要求,则可以使用convertTo函数进行深度转换,cvtColor进行通道转换。或者说直接使用FileStorage I/O函数将数据保存为XML或者YAML格式的文件
2.ImwriteFlags解析
在 OpenCV 中,imwrite 函数用于将图像写入文件,并且可以通过 imwrite 的第三个参数 flags 来控制输出图像的格式和质量。imwriteFlags 是一个可选参数,它可以包含多个标志,用于指定不同的保存选项。这些标志在不同的图像格式中可以有不同的含义。以下是一些常用的 imwrite 标志(flags)以及它们的用途:
常见的 imwriteFlags
- JPEG 格式选项
- cv::IMWRITE_JPEG_QUALITY: 指定 JPEG 图像的质量,取值范围为 0 到 100,默认值为 95。较高的值表示较高的质量和较大的文件大小。
std::vector<int> compression_params;
compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
compression_params.push_back(90); // Quality level
- PNG 格式选项
- cv::IMWRITE_PNG_COMPRESSION: 指定 PNG 图像的压缩级别,取值范围为 0 到 9。0 表示无压缩,9 表示最大压缩。
std::vector<int> compression_params;
compression_params.push_back(cv::IMWRITE_PNG_COMPRESSION);
compression_params.push_back(3); // Compression level
- PPM/PGM 格式选项
- cv::IMWRITE_PXM_BINARY: 用于指定 PPM/PGM 格式是否使用二进制格式保存,值为 0 表示 ASCII 格式,非零值表示二进制格式。
- TIFF 格式选项
- cv::IMWRITE_TIFF_RESUNIT: 指定分辨率单位;
- cv::IMWRITE_TIFF_XDPI 和 cv::IMWRITE_TIFF_YDPI: 指定水平和垂直方向的 DPI。
3. 示例代码
#include <opencv2/imgcodecs.hpp>
using namespace cv;
using namespace std;
static void createAlphaMat(Mat& mat)
{
CV_Assert(mat.channels() == 4);
for (int i = 0; i < mat.rows; ++i)
{
for (int j = 0; j < mat.cols; ++j)
{
Vec4b& bgra = mat.at<Vec4b>(i, j);
bgra[0] = UCHAR_MAX; // Blue
bgra[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green
bgra[2] = saturate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Red
bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha
}
}
}
int main()
{
// Create mat with alpha channel
Mat mat(480, 640, CV_8UC4);
createAlphaMat(mat);
vector<int> compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
bool result = false;
try
{
result = imwrite("alpha.png", mat, compression_params);
}
catch (const cv::Exception& ex)
{
fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
}
if (result)
printf("Saved PNG file with alpha data.\n");
else
printf("ERROR: Can't save PNG file.\n");
return result ? 0 : 1;
}