众所周知,OpenCv中的cvSaveImage函数可以进行图片的保存,其函数源码定义如下:
/* save image to file */
CVAPI(int) cvSaveImage( const char* filename, const CvArr* image,const int* params CV_DEFAULT(0) );
可以看到cvSaveImage函数有三个参数,第一个为要保存的文件名,第二个为要保存的图片,第三个为保存的图片的另外附加属性。
由于本人在毕设的课题中要对一幅图片进行剪切之后,并保存剪切之后的图片,所以要使用cvSaveImage来保存多张图,所以,问题就来了,该如何使用cvSaveImage函数进行多张图片的保存呢?接下来就让我们用程序来测试一下吧!
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
int main(int argc, char* argv[])
{
IplImage* imgSrc = cvLoadImage("E:\\a.png", CV_LOAD_IMAGE_COLOR);
IplImage* img_gray = cvCreateImage(cvGetSize(imgSrc), IPL_DEPTH_8U, 1);//对图片进行灰度化
cvCvtColor(imgSrc, img_gray, CV_BGR2GRAY);
cvThreshold(img_gray, img_gray, 100, 255, CV_THRESH_BINARY_INV);//对图片进行二值化
cvShowImage("ThresholdImg", img_gray);
CvSeq* contours = NULL;
CvMemStorage* storage = cvCreateMemStorage(0);
int count = cvFindContours(img_gray, storage, &contours, sizeof(CvContour), CV_RETR_EXTERNAL);//统计轮廓个数
printf("轮廓个数:%d", count);
int idx = 0;
char szName[56] = { 0 };
int tempCount = 0;
for (CvSeq* c = contours; c != NULL; c = c->h_next) {
CvRect rc = cvBoundingRect(c, 0);
cvDrawRect(imgSrc, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0));
IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);
cvSetImageROI(imgSrc, rc);
cvCopyImage(imgSrc, imgNo);
cvResetImageROI(imgSrc);
sprintf(szName, "E:\\%d.jpg", idx++);//设置保存路径
cvNamedWindow(szName);
cvShowImage(szName, imgNo);
cvSaveImage(szName,imgNo);//保存图片
cvReleaseImage(&imgNo);
}
cvNamedWindow("src");
cvShowImage("src", imgSrc);
cvWaitKey(0);
cvReleaseMemStorage(&storage);
cvReleaseImage(&imgSrc);
cvReleaseImage(&img_gray);
cvDestroyAllWindows();
return 0;
}
测试结果如下图所示:
1.原图
2.结果图
另外,cvSaveImage函数还有第三个参数,那么第三个参数有什么用呢?那么,再做一个测试吧~
该博客有讲解有关于第三个参数http://www.cnblogs.com/wolfplan/p/4058851.html的相关用法,那么接下来就进行验证吧。
测试代码如下:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#define CV_IMWRITE_JPEG_QUALITY 1
#define CV_IMWRITE_PNG_COMPRESSION 16
#define CV_IMWRITE_PXM_BINARY 32
int main(int argc, char* argv[])
{
int p[3];
IplImage *img = cvLoadImage("E:\\test.jpg");
p[0] = CV_IMWRITE_JPEG_QUALITY;
p[1] = 10;
p[2] = 0;
cvSaveImage("out1.jpg", img, p);
p[0] = CV_IMWRITE_JPEG_QUALITY;
p[1] = 100;
p[2] = 0;
cvSaveImage("out2.jpg", img, p);
p[0] = CV_IMWRITE_PNG_COMPRESSION;
p[1] = 100;
p[2] = 0;
cvSaveImage("out3.jpg",img,p);
p[0] = CV_IMWRITE_PXM_BINARY;
p[1] = 100;
p[2] = 0;
cvSaveImage("out4.jpg", img, p);
return 0;
}
对比测试结果,原图大小为289KB,out1大小为4.55KB,out2大小为42.8KB,out3大小为27.5KB,out4大小为27.5KB,由此可见仅有第二个即p[1]改变图片的大小,另外一个参数并不会改变图片的大小。最后
点击打开链接中指出,p[1]即quality的取值范围为0-100,而默认的值为95.
由于本人刚开始接触OpenCv,所以有些东西了解的并不是很深,如果有错误的地方,欢迎指正。