1. 程式人生 > >OpenCV學習筆記06--資料儲存、配置檔案

OpenCV學習筆記06--資料儲存、配置檔案

本節主要學習OpenCV中的資料儲存、配置檔案

如果只是儲存一個使用者物件,我們可以用cvSave

void cvSave( const char* filename, const void* struct_ptr,

const char* name=NULL, const char* comment=NULL,CvAttrList attributes=cvAttrList());

重要的引數:filename初始化檔名。   struct_ptr指定要儲存的物件。

可選引數:name可選擇的物件名 。如果為 NULL, 物件名將從filename中列出。

          comment可選註釋。加在檔案的開始處。

          attributes  可選屬性。 傳遞給cvWrite

而它的讀取用cvLoad

例十一:建立配置檔案

如果要儲存配置檔案,我們需要進行以下幾步操作:

一、用cvOpenStorage來開啟檔案儲存器,然後建立或開啟這個配置檔案

二、寫入資料  

1.如果是整形資料用cvWriteInt寫入

2.如果是寫入一個結構,需要先用cvStartWriteStruct宣告往什麼結構裡寫入資料,然後再用cvWriteInt寫入,寫完後用cvEndWriteStruct結束。

三、用cvWrite寫入使用者物件,比如一幅影象

1.CvFileStorage* cvOpenFileStorage( const char* filename, CvMemStorage* memstorage, int flags );

開啟檔案儲存器讀寫資料,之後建立檔案或繼續使用現有的檔案進行讀/寫資料。

Filename 記憶體中的相關檔案的檔名。

memstorage記憶體中通常儲存臨時資料和動態結構,例如 CvSeq 和 CvGraph。如果為空,將建立和使用一個暫存器。

flags/寫選擇器。

CV_STORAGE_READ - 記憶體處於讀狀態。

CV_STORAGE_WRITE - 記憶體處於寫狀態。

 副檔名決定讀檔案的型別 : .xml 是 XML的副檔名, .yml 或 .yaml 是 YAML的副檔名。該函式的返回指標指向CvFileStorage結構。

2.void  cvWriteInt( CvFileStorage* fs, const char* name, int value );

將一個單獨的整型值(有符號的或無符號的)寫入檔案儲存器

fs初始的檔案儲存器。

name寫入值的名稱 。如果母結構是一個序列,把name的值置為NULL

value寫入的整型值。

3.void  cvStartWriteStruct( CvFileStorage* fs, const char* name,

int struct_flags, const char* type_name=NULL,CvAttrList attributes=cvAttrList());

向檔案儲存器中寫資料

name被寫入的資料結構的名稱。在儲存器被讀取時可以通過名稱訪問資料結構。

struct_flags有下列兩個值:

CV_NODE_SEQ - 被寫入的資料結構為序列結構。這樣的資料沒有名稱。

CV_NODE_MAP - 被寫入的資料結構為圖表結構。這樣的資料含有名稱。

這兩個標誌符必須被指定一個

CV_NODE_FLOW - 這個可選擇識別符號只能作用於YAML流。被寫入的資料結構被看做一個數據流(不是資料塊),它更加緊湊,當結構或數組裡的資料是標量時,推薦用這個標誌。

在執行完此函式後用cvWriteInt往結構裡寫入整型值。

4.void  cvEndWriteStruct( CvFileStorage* fs );

函式cvEndWriteStruct 結束普通的寫資料操作。

5.void  cvWrite( CvFileStorage* fs, const char* name,

               const void* ptr, CvAttrList attributes=cvAttrList() );

寫入使用者物件

ptr定義指標指向物件。

attributes定義物件的屬性,每種型別都有特別的指定。

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int _tmain(int argc, _TCHAR* argv[])
{
   	    IplImage *src1, *src2;
	if ((src1 = cvLoadImage("D:\\2.jpg")) != 0 && (src2 = cvLoadImage("D:\\kk.jpg")) != 0){
		cvSetImageROI(src1, cvRect(250, 180, 400, 400));
		cvSetImageROI(src2, cvRect(0, 0, 400, 400));
		cvAddWeighted(src1, 0.4, src2, 1, 0.0, src1);
		cvResetImageROI(src1);
		cvNamedWindow("blend", 0);
		//cvSave("D:\\1.xml", src1);
		CvFileStorage* fs = cvOpenFileStorage("D:\\text.xml", NULL, CV_STORAGE_WRITE);
		cvWriteInt(fs, "frame_count", 10);
		cvStartWriteStruct(fs, "frame_size", CV_NODE_SEQ);
		cvWriteInt(fs, 0, 320);
		cvWriteInt(fs, 0, 320);
		cvEndWriteStruct(fs);
		cvWrite(fs, "color_cvt", src1);
		cvShowImage("blend", src1);
		cvWaitKey(0);
		return 0;
	}
}

讀取配置檔案

1.int cvReadIntByName( const CvFileStorage* fs, const CvFileNode* map,

                     const char* name, int default_value=0 );

讀取一個有名稱的整數型(原:查詢檔案節點返回它的值)

2.CvFileNode* cvGetFileNodeByName( const CvFileStorage* fs,

                                const CvFileNode* map,const char* name );

在圖表或者檔案儲存器中查詢節點(即為用cvStartWriteStruct建立的結構

map

設定父圖表。如果為NULL,函式 在所有的高層節點(流)中檢索, 從第一個開始。

name

設定檔案節點名。