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
設定檔案節點名。