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

設置文件節點名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章