CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- ファイルストレージ(File Storage)
- データの書き込み(Writing Data)
- データの読み込み(Reading Data)
- 実行時型情報と汎用関数(RTTI and Generic Functions)
 
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
データ永続性と実行時型情報(Data Persistence and RTTI)
ファイルストレージ(File Storage)
CvFileStorage
ファイルストレージ
    typedef struct CvFileStorage
    {
        ...       // 隠しフィールド
    } CvFileStorage;
構造体CvFileStorageは, ディスク内にあるファイルと関連付けられたファイルストレージの「ブラックボックス」的な表現である. 後述する様々な関数はCvFileStorageを引数に持ち,で構成される スカラー値や標準的なCXCoreオブジェクト(行列やシーケンス,グラフなど),ユーザ定義オブジェクトなどからなる階層的なコレクションのセーブとロードをユーザに提供する.
CXCoreは,XML(http://www.w3c.org/XML)や YAML (http://www.yaml.org)形式のデータの読み書きが可能である. 以下はXMLとYAMLによる浮動小数点型の3×3単位行列Aの表現である.CXCoreの関数を用いると次のようになる.
- XML:
- <?xml version="1.0"> <opencv_storage> <A type_id="opencv-matrix"> <rows>3</rows> <cols>3</cols> <dt>f</dt> <data>1. 0. 0. 0. 1. 0. 0. 0. 1.</data> </A> </opencv_storage> 
- YAML:
- %YAML:1.0 A: !!opencv-matrix rows: 3 cols: 3 dt: f data: [ 1., 0., 0., 0., 1., 0., 0., 0., 1.] 
この例で見られるように,XMLでは階層構造の表現にネスト(入れ子)されたタグを用い,YAMLでは(Pythonと類似した)インデントを用いる.
同じCXCore関数を用いて両データ形式の読み書きが可能であり,形式は開かれたファイルの拡張子で判別される. 拡張子はXMLの場合.xml,YAMLの場合は.ymlである.
CvFileNode
ファイルストレージノード
/* ファイルノードタイプ */
#define CV_NODE_NONE        0
#define CV_NODE_INT         1
#define CV_NODE_INTEGER     CV_NODE_INT
#define CV_NODE_REAL        2
#define CV_NODE_FLOAT       CV_NODE_REAL
#define CV_NODE_STR         3
#define CV_NODE_STRING      CV_NODE_STR
#define CV_NODE_REF         4 /* 使用されない */
#define CV_NODE_SEQ         5
#define CV_NODE_MAP         6
#define CV_NODE_TYPE_MASK   7
/* オプションのフラグ */
#define CV_NODE_USER        16
#define CV_NODE_EMPTY       32
#define CV_NODE_NAMED       64
#define CV_NODE_TYPE(tag)  ((tag) & CV_NODE_TYPE_MASK)
#define CV_NODE_IS_INT(tag)        (CV_NODE_TYPE(tag) == CV_NODE_INT)
#define CV_NODE_IS_REAL(tag)       (CV_NODE_TYPE(tag) == CV_NODE_REAL)
#define CV_NODE_IS_STRING(tag)     (CV_NODE_TYPE(tag) == CV_NODE_STRING)
#define CV_NODE_IS_SEQ(tag)        (CV_NODE_TYPE(tag) == CV_NODE_SEQ)
#define CV_NODE_IS_MAP(tag)        (CV_NODE_TYPE(tag) == CV_NODE_MAP)
#define CV_NODE_IS_COLLECTION(tag) (CV_NODE_TYPE(tag) >= CV_NODE_SEQ)
#define CV_NODE_IS_FLOW(tag)       (((tag) & CV_NODE_FLOW) != 0)
#define CV_NODE_IS_EMPTY(tag)      (((tag) & CV_NODE_EMPTY) != 0)
#define CV_NODE_IS_USER(tag)       (((tag) & CV_NODE_USER) != 0)
#define CV_NODE_HAS_NAME(tag)      (((tag) & CV_NODE_NAMED) != 0)
#define CV_NODE_SEQ_SIMPLE 256
#define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0)
typedef struct CvString
{
    int len;
    char* ptr;
}
CvString;
/* 読み込んだファイルストレージに含まれる要素の全てのキー(names)は,
   ルックアップ処理の高速化のためハッシュに記憶される */
typedef struct CvStringHashNode
{
    unsigned hashval;
    CvString str;
    struct CvStringHashNode* next;
}
CvStringHashNode;
/* ファイルストレージの基本要素 - スカラー,またはコレクション */
typedef struct CvFileNode
{
    int tag;
    struct CvTypeInfo* info; /* 型情報(ユーザ定義オブジェクト用,そうでない場合は0) */
    union
    {
        double f; /* 浮動小数点型のスカラー値 */
        int i;    /* 整数型のスカラー値 */
        CvString str; /* 文字列 */
        CvSeq* seq; /* シーケンス(順序付きファイルノードのコレクション) */
        struct CvMap* map; /* マップ(名前付きファイルノードのコレクション) */
    } data;
}
CvFileNode;
この構造体は,ファイルストレージからデータを取り出す(例えば,ファイルからのデータ読み込み)ためだけに用いられる.ファイルへのデータ書き込みは,最小限のバッファを使い逐次的に実行される.ファイルストレージには,データは保存されない.
反対に,ファイルからデータが読み込まれた場合,全てのファイルは解析されて,メモリ内では木構造として表現される. 木構造のそれぞれのノードはCvFileNodeで表現される. ファイルノードNの型は,CV_NODE_TYPE(N->tag)として取得できる. 幾つかのファイルノード(葉)は,文字列や,整数,浮動小数点数などのスカラーである. その他のファイルノードは,ファイルノードのコレクション,スカラーのコレクション,あるいはコレクションのコレクション,などである. コレクションにはシーケンスとマップの2つの型がある(ここではYAMLの表記法を使うが,XMLストリームでも同様である). シーケンス(CvSeq と混同しないように)は名前付けされていないファイルノードの整列されたコレクションで, マップは名前付けされたファイルノードの整列されていないコレクションである. このように,シーケンスの要素には,インデックス(cvGetSeqElem)によりアクセスされ, マップの要素には名前(cvGetFileNodeByName)でアクセスされる. 以下の表はファイルノードの型の違いを示す.
| 型 | CV_NODE_TYPE(node->tag) | 値 | 
| 整数 | CV_NODE_INT | node->data.i | 
| 浮動小数点 | CV_NODE_REAL | node->data.f | 
| 文字列 | CV_NODE_STR | node->data.str.ptr | 
| シーケンス | CV_NODE_SEQ | node->data.seq | 
| マップ | CV_NODE_MAP | node->data.map* | 
- *
- map フィールドに直接アクセスする必要は無い(CvMapは隠された構造体である). このマップの要素は,「マップ」ファイルノードのポインタを引数に持つ関数 cvGetFileNodeByNameを使って取得できる.
ユーザ(カスタム)オブジェクトはCvMatやCvSeq等の標準的なCxCoreの型か, cvRegisterTypeで登録された型のインスタンスである. これらのオブジェクトは,ファイルストレージが開かれて解析された後,初期状態ではファイル内でマップ(上述のXMLとYAMLのサンプルファイルのように)として表現されている. その後,オブジェクトはリクエスト(関数cvReadやcvReadByNameを使った場合) に応じてデコード(元々の表現に変換)される.
CvAttrList
属性のリスト
typedef struct CvAttrList
{
    const char** attr; /* (attribute_name,attribute_value)のペアからなるNULLで終わる配列 */
    struct CvAttrList* next; /* 属性リストの次の塊へのポインタ */
}
CvAttrList;
/* 構造体CvAttrListの初期化 */
inline CvAttrList cvAttrList( const char** attr=NULL, CvAttrList* next=NULL );
/* 属性の値を返すか,もしそのような属性が存在しない場合には0(NULL)を返す */
const char* cvAttrValue( const CvAttrList* attr, const char* attr_name );
現在の実装では,属性はユーザオブジェクトを書き込む際の特別なパラメータを渡すために使われる(cvWriteを参照). タグの中にあるXMLの属性はオブジェクトの型指定(type_id属性)を除いてサポートされない.
OpenFileStorage
データ読み書きのためのファイルをオープンする
CvFileStorage* cvOpenFileStorage( const char* filename, CvMemStorage* memstorage, int flags );
- filename
- ストレージに関連づけられたファイルの名前.
- memstorage
- 一時的なデータや,CvSeqや CvGraphなどの動的構造体の保存に使われるメモリストレージ.NULLの場合,一時的なメモリが確保されて使用される.
- flags
- 以下の内の一つを指定.
 CV_STORAGE_READ - データ読み込みのためのファイルオープン
 CV_STORAGE_WRITE - データ書き込みのためのファイルオープン
 
関数cvOpenFileStorageは,データの読み書きのためのファイルを開く. 書き込みの場合は,新しいファイルが作成されるか,ファイルが存在する場合には上書きされる.また,読み書きされるファイルの種類は拡張子で判別される. XMLの場合は.xml,YAMLの場合は.ymlまたは.yamlである. この関数の戻り値は構造体CvFileStorageへのポインタである.
ReleaseFileStorage
ファイルストレージの解放
void cvReleaseFileStorage( CvFileStorage** fs );
- fs
- 解放するファイルへのポインタのポインタ.
関数cvReleaseFileStorageはファイルを閉じて,一時的な構造体をすべて解放する. この関数は,すべての入出力操作が終了した後に実行されなければならない.
