/// <summary> /// /// </summary> /// <param name="fileName">書きこむXML or YAMLファイル</param> private static void SampleFileStorageWriteSeq(string fileName) { // cvStartWriteStruct, cvEndWriteStruct const int size = 20; CvRNG rng = new CvRNG((ulong)DateTime.Now.Ticks); CvPoint[] pt = new CvPoint[size]; for (int i = 0; i < pt.Length; i++) { pt[i].X = (int)rng.RandInt(100); pt[i].Y = (int)rng.RandInt(100); } using (CvFileStorage fs = new CvFileStorage(fileName, null, FileStorageMode.Write)) { fs.StartWriteStruct("points", NodeType.Seq); for (int i = 0; i < pt.Length; i++) { fs.StartWriteStruct(null, NodeType.Map | NodeType.Flow); fs.WriteInt("x", pt[i].X); fs.WriteInt("y", pt[i].Y); fs.EndWriteStruct(); } fs.EndWriteStruct(); } }
/// <summary> /// マップのシーケンスのファイルストレージへの書き込み /// </summary> /// <param name="fileName">書きこむXML or YAMLファイル</param> private static void SampleFileStorageWriteSeq(string fileName) { // cvStartWriteStruct, cvEndWriteStruct // 二つのエントリを持つマップのシーケンスをファイルに保存する const int size = 20; CvRNG rng = new CvRNG((ulong)DateTime.Now.Ticks); CvPoint[] pt = new CvPoint[size]; // (1)点列の作成 for (int i = 0; i < pt.Length; i++) { pt[i].X = (int)rng.RandInt(100); pt[i].Y = (int)rng.RandInt(100); } // (2)マップのシーケンスとして点列を保存 using (CvFileStorage fs = new CvFileStorage(fileName, null, FileStorageMode.Write)) { fs.StartWriteStruct("points", NodeType.Seq); for (int i = 0; i < pt.Length; i++) { fs.StartWriteStruct(null, NodeType.Map | NodeType.Flow); fs.WriteInt("x", pt[i].X); fs.WriteInt("y", pt[i].Y); fs.EndWriteStruct(); } fs.EndWriteStruct(); } // (3)書きこんだyamlファイルを開く //using (Process p = Process.Start(fileName)) { // p.WaitForExit(); //} }
public TreeNodeIterator() { using (CvMemStorage storage = new CvMemStorage(0)) using (IplImage srcImg = new IplImage(Const.ImageLenna, LoadMode.Color)) using (IplImage srcImgGray = new IplImage(srcImg.Size, BitDepth.U8, 1)) using (IplImage tmpImg = new IplImage(srcImg.Size, BitDepth.U8, 1)) { Cv.CvtColor(srcImg, srcImgGray, ColorConversion.BgrToGray); // (1)画像の二値化と輪郭の検出 Cv.Threshold(srcImgGray, tmpImg, 120, 255, ThresholdType.Binary); CvSeq<CvPoint> contours; Cv.FindContours(tmpImg, storage, out contours, CvContour.SizeOf, ContourRetrieval.Tree, ContourChain.ApproxSimple); /* 輪郭シーケンスから座標を取得 */ using (CvFileStorage fs = new CvFileStorage("contours.yaml", null, FileStorageMode.Write)) { // (2)ツリーノードイテレータの初期化 CvTreeNodeIterator<CvSeq<CvPoint>> it = new CvTreeNodeIterator<CvSeq<CvPoint>>(contours, 1); // (3)各ノード(輪郭)を走査 //CvSeq<CvPoint> contour; //while ((contour = it.NextTreeNode()) != null) foreach(CvSeq<CvPoint> contour in it) { fs.StartWriteStruct("contour", NodeType.Seq); // (4)輪郭を構成する頂点座標を取得 CvPoint tmp = contour[-1].Value; for (int i = 0; i < contour.Total; i++) { CvPoint point = contour[i].Value; srcImg.Line(tmp, point, CvColor.Blue, 2); fs.StartWriteStruct(null, NodeType.Map | NodeType.Flow); fs.WriteInt("x", point.X); fs.WriteInt("y", point.Y); fs.EndWriteStruct(); tmp = point; } fs.EndWriteStruct(); } } Console.WriteLine(File.ReadAllText("contours.yaml")); using (new CvWindow("Contours", srcImg)) { Cv.WaitKey(0); } } }
public TreeNodeIterator() { using (CvMemStorage storage = new CvMemStorage(0)) using (IplImage srcImg = new IplImage(Const.ImageLenna, LoadMode.Color)) using (IplImage srcImgGray = new IplImage(srcImg.Size, BitDepth.U8, 1)) using (IplImage tmpImg = new IplImage(srcImg.Size, BitDepth.U8, 1)) { Cv.CvtColor(srcImg, srcImgGray, ColorConversion.BgrToGray); // (1)画像の二値化と輪郭の検出 Cv.Threshold(srcImgGray, tmpImg, 120, 255, ThresholdType.Binary); CvSeq <CvPoint> contours; Cv.FindContours(tmpImg, storage, out contours, CvContour.SizeOf, ContourRetrieval.Tree, ContourChain.ApproxSimple); /* 輪郭シーケンスから座標を取得 */ using (CvFileStorage fs = new CvFileStorage("contours.yaml", null, FileStorageMode.Write)) { // (2)ツリーノードイテレータの初期化 CvTreeNodeIterator <CvSeq <CvPoint> > it = new CvTreeNodeIterator <CvSeq <CvPoint> >(contours, 1); // (3)各ノード(輪郭)を走査 //CvSeq<CvPoint> contour; //while ((contour = it.NextTreeNode()) != null) foreach (CvSeq <CvPoint> contour in it) { fs.StartWriteStruct("contour", NodeType.Seq); // (4)輪郭を構成する頂点座標を取得 CvPoint tmp = contour[-1].Value; for (int i = 0; i < contour.Total; i++) { CvPoint point = contour[i].Value; srcImg.Line(tmp, point, CvColor.Blue, 2); fs.StartWriteStruct(null, NodeType.Map | NodeType.Flow); fs.WriteInt("x", point.X); fs.WriteInt("y", point.Y); fs.EndWriteStruct(); tmp = point; } fs.EndWriteStruct(); } } Console.WriteLine(File.ReadAllText("contours.yaml")); using (new CvWindow("Contours", srcImg)) { Cv.WaitKey(0); } } }