public Doctor(Block block) { Block = block; int size = block.Size; spare = new byte[size]; Buffer.BlockCopy(block.data, 0, spare, 0, size); xor = new byte[8]; RNG.Fill(xor); //block.BeforeWrite += Block_BeforeWrite; block.AfterWrite += Block_AfterWrite; //block.BeforeRead += Block_BeforeRead; //block.AfterRead += Block_AfterRead; }
/// <summary> /// https://github.com/Itseez/opencv_extra/blob/master/learning_opencv_v2/ch13_ex13_1.cpp /// </summary> private static void example01() { using (var window = new Window("Clusters", flags: WindowMode.AutoSize | WindowMode.FreeRatio)) { const int maxClusters = 5; var rng = new RNG(state: (ulong)DateTime.Now.Ticks); for (; ;) { var clustersCount = rng.Uniform(a: 2, b: maxClusters + 1); var samplesCount = rng.Uniform(a: 1, b: 1001); var points = new Mat(rows: samplesCount, cols: 1, type: MatType.CV_32FC2); clustersCount = Math.Min(clustersCount, samplesCount); var img = new Mat(rows: 500, cols: 500, type: MatType.CV_8UC3, s: Scalar.All(0)); // generate random sample from multi-gaussian distribution for (var k = 0; k < clustersCount; k++) { var pointChunk = points.RowRange( startRow: k * samplesCount / clustersCount, endRow: (k == clustersCount - 1) ? samplesCount : (k + 1) * samplesCount / clustersCount); var center = new Point { X = rng.Uniform(a: 0, b: img.Cols), Y = rng.Uniform(a: 0, b: img.Rows) }; rng.Fill( mat: pointChunk, distType: DistributionType.Normal, a: new Scalar(center.X, center.Y), b: new Scalar(img.Cols * 0.05f, img.Rows * 0.05f)); } Cv2.RandShuffle(dst: points, iterFactor: 1, rng: rng); var labels = new Mat(); var centers = new Mat(rows: clustersCount, cols: 1, type: points.Type()); Cv2.Kmeans( data: points, k: clustersCount, bestLabels: labels, criteria: new TermCriteria(CriteriaType.Epsilon | CriteriaType.Iteration, 10, 1.0), attempts: 3, flags: KMeansFlag.PpCenters, centers: centers); Scalar[] colors = { new Scalar(0, 0, 255), new Scalar(0, 255, 0), new Scalar(255, 100, 100), new Scalar(255, 0, 255), new Scalar(0, 255, 255) }; for (var i = 0; i < samplesCount; i++) { var clusterIdx = labels.At <int>(i); Point ipt = points.At <Point2f>(i); Cv2.Circle( img: img, center: ipt, radius: 2, color: colors[clusterIdx], lineType: LineType.AntiAlias, thickness: Cv.FILLED); } window.Image = img; var key = (char)Cv2.WaitKey(); if (key == 27 || key == 'q' || key == 'Q') // 'ESC' { break; } } } }
/// <summary> /// https://github.com/Itseez/opencv_extra/blob/master/learning_opencv_v2/ch13_ex13_1.cpp /// </summary> private static void example01() { using (var window = new Window("Clusters", flags: WindowMode.AutoSize | WindowMode.FreeRatio)) { const int maxClusters = 5; var rng = new RNG(state: (ulong)DateTime.Now.Ticks); for (; ; ) { var clustersCount = rng.Uniform(a: 2, b: maxClusters + 1); var samplesCount = rng.Uniform(a: 1, b: 1001); var points = new Mat(rows: samplesCount, cols: 1, type: MatType.CV_32FC2); clustersCount = Math.Min(clustersCount, samplesCount); var img = new Mat(rows: 500, cols: 500, type: MatType.CV_8UC3, s: Scalar.All(0)); // generate random sample from multi-gaussian distribution for (var k = 0; k < clustersCount; k++) { var pointChunk = points.RowRange( startRow: k * samplesCount / clustersCount, endRow: (k == clustersCount - 1) ? samplesCount : (k + 1) * samplesCount / clustersCount); var center = new Point { X = rng.Uniform(a: 0, b: img.Cols), Y = rng.Uniform(a: 0, b: img.Rows) }; rng.Fill( mat: pointChunk, distType: DistributionType.Normal, a: new Scalar(center.X, center.Y), b: new Scalar(img.Cols * 0.05f, img.Rows * 0.05f)); } Cv2.RandShuffle(dst: points, iterFactor: 1, rng: rng); var labels = new Mat(); var centers = new Mat(rows: clustersCount, cols: 1, type: points.Type()); Cv2.Kmeans( data: points, k: clustersCount, bestLabels: labels, criteria: new TermCriteria(CriteriaType.Epsilon | CriteriaType.Iteration, 10, 1.0), attempts: 3, flags: KMeansFlag.PpCenters, centers: centers); Scalar[] colors = { new Scalar(0, 0, 255), new Scalar(0, 255, 0), new Scalar(255, 100, 100), new Scalar(255, 0, 255), new Scalar(0, 255, 255) }; for (var i = 0; i < samplesCount; i++) { var clusterIdx = labels.At<int>(i); Point ipt = points.At<Point2f>(i); Cv2.Circle( img: img, center: ipt, radius: 2, color: colors[clusterIdx], lineType: LineType.AntiAlias, thickness: Cv.FILLED); } window.Image = img; var key = (char)Cv2.WaitKey(); if (key == 27 || key == 'q' || key == 'Q') // 'ESC' { break; } } } }