1. 程式人生 > >OpenCv中cvSaveImage儲存多張圖片

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,所以有些東西瞭解的並不是很深,如果有錯誤的地方,歡迎指正。