public static void Test(Projector projector, Camera camera) { if (DebugWindow != null) for (var i = 1; i < 0; i++) { projector.DrawBackground(Color.Black); var nolight = camera.TakePicture(10); projector.DrawBinary(i, false, Color.Green); var fulllight = camera.TakePicture(3); var n = new Image<Bgr, byte>(nolight); var f = new Image<Bgr, byte>(fulllight); Point p = new Point(); var d = (f - n).Split()[1]; DebugWindow.DrawBitmap(d.Bitmap); double[] min, max; Point[] minp, maxp; d.MinMax(out min, out max, out minp, out maxp); var thresh = (max.Max() - min.Min()) * 0.08 + min.Min(); d = d.ThresholdBinary(new Gray(thresh), new Gray(255)).Erode(2).Dilate(3).Erode(1); DebugWindow.DrawBitmap(d.Bitmap); } }
public static double[] BinarySL(Projector projector, Camera camera, PointF[] corners, Bitmap nolight, Color fullColor, bool vertical) { int[] horizontal = new int[corners.Length]; int max = (int)Math.Floor(Math.Log((vertical ? projector.bitmap.Width : projector.bitmap.Height), 2)) + 1; int subdivisions = 1; var nol = Classifier(nolight); for (var step = 1; step <= max - 4; step++) { projector.DrawBackground(Color.Black); camera.TakePicture(5).Dispose(); projector.DrawBinary(step, vertical, fullColor); var light = camera.TakePicture(2); var classifier = nol(light, step); int idx = 0; Bitmap withCorners = null; foreach (var point in corners) { var hit = classifier(point); var h = horizontal[idx]; h = h << 1; h = h | (hit ? 1 : 0); horizontal[idx] = h; idx++; if (DebugWindow != null) { withCorners = light; QuickDraw.Start(withCorners) .Color(hit ? Color.Gray : Color.White) .DrawPoint(point.X, point.Y, 5) .Finish(); } } if (DebugWindow != null) DebugWindow.DrawBitmap(withCorners); light.Dispose(); subdivisions++; } var result = horizontal.Select(row => ((double)row / Math.Pow(2, max - 4)) * (vertical ? projector.bitmap.Width : projector.bitmap.Height)).ToArray(); using (var bitmap = new Bitmap(projector.bitmap.Width, projector.bitmap.Height)) { using (var fast = new FastBitmap(bitmap)) { for (var x = 0; x < bitmap.Width; x++) for (var y = 0; y < bitmap.Height; y++) if (result.Contains(vertical ? x : y)) fast[x, y] = Color.FromArgb(255, 255, 255, 255); else fast[x, y] = Color.FromArgb(255, 0, 0, 0); } projector.DrawBitmap(bitmap); } return result; }