一、背景介绍
OpenCV是一款开源的计算机视觉库,可以用于图像和视频处理。在实际工作中,我们经常需要对处理完的图像进行保存,而保存的方式和路径也是多样的。本文将围绕这一主题,详细介绍如何使用OpenCV将图像保存到指定路径。
二、保存图片到指定路径的C语言代码
前置知识:在OpenCV中,使用cvSaveImage函数将图像保存到文件中。该函数的原型如下所示:
int cvSaveImage(const char* filename, const CvArr* image, const int* params=0)
其中,filename是要保存的文件名,image是图像数据,params是存储时要使用的参数,可以不填。函数返回值表示保存结果,0表示失败,大于0表示成功。
下面是将图像保存到指定路径的C语言代码:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
if (argc != 3) {
cout << "Usage: SaveImage image_path save_path" << endl;
return -1;
}
const char *image_path = argv[1];
const char *save_path = argv[2];
IplImage* img = cvLoadImage(image_path);
if (!img) {
cout << "Fail to load image from " << image_path << endl;
return -2;
}
if (!cvSaveImage(save_path, img)) {
cout << "Fail to save image to " << save_path << endl;
return -3;
}
cvReleaseImage(&img);
cout << "Image has been saved to " << save_path << endl;
return 0;
}
该代码通过命令行参数传入了原图路径和保存路径,加载原图后使用cvSaveImage函数保存到指定路径中。注意,函数返回值为0表示保存失败。
三、在图像中添加文字并进行保存
如果需要在图片中添加一些文字说明,我们可以使用OpenCV提供的绘图函数。下面是一个例子,将一些文本添加到图像中,并进行保存:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
if (argc != 3) {
cout << "Usage: AddText image_path save_path" << endl;
return -1;
}
const char *image_path = argv[1];
const char *save_path = argv[2];
IplImage* img = cvLoadImage(image_path);
if (!img) {
cout << "Fail to load image from " << image_path << endl;
return -2;
}
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA);
cvPutText(img, "Hello, OpenCV!", cvPoint(20, 50), &font, cvScalar(0, 255, 0));
if (!cvSaveImage(save_path, img)) {
cout << "Fail to save image to " << save_path << endl;
return -3;
}
cvReleaseImage(&img);
cout << "Image has been saved to " << save_path << endl;
return 0;
}
该代码使用cvPutText函数将文本添加到图像中,具体用法可参考OpenCV官方文档。如果需要更改文本样式,可以通过CvFont结构体进行设置。
四、图片质量设置及参数说明
在使用OpenCV保存图像时,可以通过参数来设置图片的压缩格式、保存质量等参数。下面是各个参数的说明:
- filename:要保存的文件名。
- image:图像数据。
- params:存储时要使用的参数,可以为NULL。
params的取值可以为以下几种:
- NULL:使用默认值,即图片质量为95。
- int数组:数组长度为1,表示图片质量,取值为0~100。0表示最小尺寸和最大压缩,100表示最大尺寸和最小压缩。
- CV_IMWRITE_JPEG_QUALITY:数组长度为1,表示jpeg图像质量,取值为0~100,0表示最小质量,100表示最大质量。
- CV_IMWRITE_PNG_COMPRESSION:数组长度为1,表示png图像压缩比,取值为0~9,0表示最小压缩,9表示最大压缩。
- CV_IMWRITE_PXM_BINARY:数组长度为1,表示pbm、pgm、ppm图像格式。0表示ascii格式,1表示二进制格式。
- CV_IMWRITE_WEBP_QUALITY:数组长度为1,表示webp图像质量,取值为0~100,0表示最小质量,100表示最大质量。
- CV_IMWRITE_WEBP_COMPRESSION:数组长度为1,表示webp图像压缩比,取值为0~100,0表示最小压缩,100表示最大压缩。
- CV_IMWRITE_TIFF_COMPRESSION:数组长度为1,表示tiff图像压缩方式,取值为0~9,0表示不压缩,1表示LZW压缩,2表示JPEG压缩,其他值表示zip压缩。
下面是一个例子,将图像保存为jpeg格式,质量为70:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
if (argc != 3) {
cout << "Usage: SaveImage image_path save_path" << endl;
return -1;
}
const char *image_path = argv[1];
const char *save_path = argv[2];
IplImage* img = cvLoadImage(image_path);
if (!img) {
cout << "Fail to load image from " << image_path << endl;
return -2;
}
int params[3] = {CV_IMWRITE_JPEG_QUALITY, 70, 0};
if (!cvSaveImage(save_path, img, params)) {
cout << "Fail to save image to " << save_path << endl;
return -3;
}
cvReleaseImage(&img);
cout << "Image has been saved to " << save_path << endl;
return 0;
}
五、总结
本文详细介绍了使用OpenCV保存图片到指定路径的方法,并给出了相应的C语言代码示例。同时,还讲解了如何在图片中添加文字以及图片保存质量的设置和参数说明。希望本文对读者在实际工作中处理图像有所帮助。