本節主要學習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
設置文件節點名。