OpenCv中cvSaveImage儲存多張圖片
阿新 • • 發佈:2018-12-29
眾所周知,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的相關用法,那麼接下來就進行驗證吧。
測試程式碼如下:
對比測試結果,原圖大小為289KB,out1大小為4.55KB,out2大小為42.8KB,out3大小為27.5KB,out4大小為27.5KB,由此可見僅有第二個即p[1]改變圖片的大小,另外一個引數並不會改變圖片的大小。最後點選開啟連結中指出,p[1]即quality的取值範圍為0-100,而預設的值為95.#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; }
由於本人剛開始接觸OpenCv,所以有些東西瞭解的並不是很深,如果有錯誤的地方,歡迎指正。