OpenCv中cvSaveImage保存多张图片

    众所周知,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,所以有些东西了解的并不是很深,如果有错误的地方,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值