/// <summary> /// /// </summary> /// <param name="fileName"></param> private static void SampleFileStorageReadSeq(string fileName) { // cvGetHashedKey, cvGetFileNode using (CvFileStorage fs = new CvFileStorage("sequence.yml", null, FileStorageMode.Read)) { CvStringHashNode xKey = fs.GetHashedKey("x", true); CvStringHashNode yKey = fs.GetHashedKey("y", true); CvFileNode points = fs.GetFileNodeByName(null, "points"); if ((points.Tag & NodeType.Seq) != 0) { CvSeq seq = points.DataSeq; int total = seq.Total; CvSeqReader reader = new CvSeqReader(); seq.StartRead(reader, false); for (int i = 0; i < total; i++) { CvFileNode pt = CvFileNode.FromPtr(reader.Ptr); int x = fs.ReadIntByName(pt, "x", 0); int y = fs.ReadIntByName(pt, "y", 0); Cv.NEXT_SEQ_ELEM(seq.ElemSize, reader); Console.WriteLine("{0}: ({1}, {2})", i, x, y); } } } Console.ReadKey(); }
/// <summary> /// マップのシーケンスのファイルストレージからの読み込み /// </summary> /// <param name="fileName">書きこむXML or YAMLファイル</param> private static void SampleFileStorageReadSeq(string fileName) { // cvGetHashedKey, cvGetFileNode // 二つのエントリを持つマップのシーケンスをファイルから読み込む // (1)ファイルストレージのオープン,ハッシュドキーの計算,シーケンスノードの取得 using (CvFileStorage fs = new CvFileStorage("sequence.yml", null, FileStorageMode.Read)) { CvStringHashNode xKey = fs.GetHashedKey("x", true); CvStringHashNode yKey = fs.GetHashedKey("y", true); CvFileNode points = fs.GetFileNodeByName(null, "points"); // (2)シーケンスリーダを初期化,各ノードを順次取得 if ((points.Tag & NodeType.Seq) != 0) { CvSeq seq = points.DataSeq; int total = seq.Total; CvSeqReader reader = new CvSeqReader(); seq.StartRead(reader, false); for (int i = 0; i < total; i++) { CvFileNode pt = CvFileNode.FromPtr(reader.Ptr); // (3)高速バージョン /* * CvFileNode xnode = fs.GetFileNode(pt, x_key, false); * CvFileNode ynode = fs.GetFileNode(pt, y_key, false); * Debug.Assert( * xnode != null && * (xnode.Tag & NodeType.Integer) != 0 && * ynode != null && * (ynode.Tag & NodeType.Integer) != 0 * ); * int x = xnode.DataI; * int i = ynode.DataI; * //*/ // (4)低速バージョン.x_keyとy_keyを使わない /* * CvFileNode xnode = fs.GetFileNodeByName(pt, "x"); * CvFileNode ynode = fs.GetFileNodeByName(pt, "i"); * Debug.Assert( * xnode != null && * (xnode.Tag & NodeType.Integer) != 0 && * ynode != null && * (ynode.Tag & NodeType.Integer) != 0 * ); * int x = xnode.DataI; * int i = ynode.DataI; * //*/ // (5)さらに低速だが,使いやすいバージョン ///* int x = fs.ReadIntByName(pt, "x", 0); int y = fs.ReadIntByName(pt, "y", 0); //*/ // (6)データを表示し,次のシーケンスノードを取得 Cv.NEXT_SEQ_ELEM(seq.ElemSize, reader); Console.WriteLine("{0}: ({1}, {2})", i, x, y); } } } Console.ReadKey(); }