public SetWindow(ref MyFlags flags, ref Game game, Tracker tracker) { InitializeComponent(); _flags = flags; _game = game; _tracker = tracker; nudHue0L.Value = flags.configs.hue0Lower; nudHue0H.Value = flags.configs.hue0Upper; nudHue1L.Value = flags.configs.hue1Lower; nudHue1H.Value = flags.configs.hue1Upper; nudHue2L.Value = flags.configs.hue2Lower; nudHue2H.Value = flags.configs.hue2Upper; nudSat0L.Value = flags.configs.saturation0Lower; nudSat1L.Value = flags.configs.saturation1Lower; nudSat2L.Value = flags.configs.saturation2Lower; nudValueL.Value = flags.configs.valueLower; nudAreaL.Value = flags.configs.areaLower; checkBox_DebugMode.Checked = game.DebugMode; cbPorts.Items.Clear(); foreach (string port in _tracker.validPorts) { cbPorts.Items.Add(port); } if (_tracker.serial != null && _tracker.serial.IsOpen) { cbPorts.Text = _tracker.serial.PortName; } BringToFront(); }
public void PeopleFilter(MyFlags flags) { if (!flags.calibrated) { return; } for (int i = 0; i < flags.currPersonNum; ++i) { Point2f[] res = LogicToCamera(new Point2f[] { flags.posPersonStart[i] }); flags.posPersonStart[i] = res[0]; } }
public CoordinateConverter(MyFlags myFlags) { camCorners = new Point2f[4]; logicCorners = new Point2f[4]; showCorners = new Point2f[4]; cam2logic = new Mat(); show2cam = new Mat(); logic2show = new Mat(); show2logic = new Mat(); cam2show = new Mat(); logic2cam = new Mat(); logicCorners[0].X = 0; logicCorners[0].Y = 0; logicCorners[1].X = myFlags.logicSize.Width; logicCorners[1].Y = 0; logicCorners[2].X = 0; logicCorners[2].Y = myFlags.logicSize.Height; logicCorners[3].X = myFlags.logicSize.Width; logicCorners[3].Y = myFlags.logicSize.Height; showCorners[0].X = 0; showCorners[0].Y = 0; showCorners[1].X = myFlags.showSize.Width; showCorners[1].Y = 0; showCorners[2].X = 0; showCorners[2].Y = myFlags.showSize.Height; showCorners[3].X = myFlags.showSize.Width; showCorners[3].Y = myFlags.showSize.Height; camCorners[0].X = 0; camCorners[0].Y = 0; camCorners[1].X = myFlags.cameraSize.Width; camCorners[1].Y = 0; camCorners[2].X = 0; camCorners[2].Y = myFlags.cameraSize.Height; camCorners[3].X = myFlags.cameraSize.Width; camCorners[3].Y = myFlags.cameraSize.Height; show2cam = Cv2.GetPerspectiveTransform(showCorners, camCorners); cam2show = Cv2.GetPerspectiveTransform(camCorners, showCorners); }
public void UpdateCorners(Point2f[] corners, MyFlags myFlags) { if (corners == null) { return; } if (corners.Length != 4) { return; } else { showCorners = corners; } logic2show = Cv2.GetPerspectiveTransform(logicCorners, showCorners); show2logic = Cv2.GetPerspectiveTransform(showCorners, logicCorners); camCorners = Cv2.PerspectiveTransform(showCorners, show2cam); cam2logic = Cv2.GetPerspectiveTransform(camCorners, logicCorners); logic2cam = Cv2.GetPerspectiveTransform(logicCorners, camCorners); myFlags.calibrated = true; }
public void Locate(Mat mat, MyFlags localiseFlags) { if (mat == null || mat.Empty()) { return; } if (localiseFlags == null) { return; } using (Mat hsv = new Mat()) using (Mat ball = new Mat()) using (Mat car1 = new Mat()) using (Mat car2 = new Mat()) //using (Mat merged = new Mat()) using (Mat black = new Mat(mat.Size(), MatType.CV_8UC1)) { Cv2.CvtColor(mat, hsv, ColorConversionCodes.RGB2HSV); MyFlags.LocConfigs configs = localiseFlags.configs; Cv2.InRange(hsv, new Scalar(configs.hue0Lower, configs.saturation0Lower, configs.valueLower), new Scalar(configs.hue0Upper, 255, 255), ball); Cv2.InRange(hsv, new Scalar(configs.hue1Lower, configs.saturation1Lower, configs.valueLower), new Scalar(configs.hue1Upper, 255, 255), car1); Cv2.InRange(hsv, new Scalar(configs.hue2Lower, configs.saturation2Lower, configs.valueLower), new Scalar(configs.hue2Upper, 255, 255), car2); if (localiseFlags.showMask) { Cv2.ImShow("Ball", ball); Cv2.ImShow("CarA", car1); Cv2.ImShow("CarB", car2); } else { Cv2.DestroyAllWindows(); } Point2i[][] contours0, contours1, contours2; contours0 = Cv2.FindContoursAsArray(ball, RetrievalModes.External, ContourApproximationModes.ApproxSimple); contours1 = Cv2.FindContoursAsArray(car1, RetrievalModes.External, ContourApproximationModes.ApproxSimple); contours2 = Cv2.FindContoursAsArray(car2, RetrievalModes.External, ContourApproximationModes.ApproxSimple); foreach (Point2i[] c0 in contours0) { Point2i centre = new Point2i(); Moments moments = Cv2.Moments(c0); centre.X = (int)(moments.M10 / moments.M00); centre.Y = (int)(moments.M01 / moments.M00); double area = moments.M00; if (area <= configs.areaLower / 9) { continue; } centres0.Add(centre); } foreach (Point2i[] c1 in contours1) { Point2i centre = new Point2i(); Moments moments = Cv2.Moments(c1); centre.X = (int)(moments.M10 / moments.M00); centre.Y = (int)(moments.M01 / moments.M00); double area = moments.M00; if (area <= configs.areaLower) { continue; } centres1.Add(centre); } foreach (Point2i[] c2 in contours2) { Point2i centre = new Point2f(); Moments moments = Cv2.Moments(c2); centre.X = (int)(moments.M10 / moments.M00); centre.Y = (int)(moments.M01 / moments.M00); double area = moments.M00; if (area <= configs.areaLower) { continue; } centres2.Add(centre); } //foreach (Point2i c0 in centres0) Cv2.Circle(mat, c0, 3, new Scalar(0x1b, 0xa7, 0xff), -1); foreach (Point2i c1 in centres1) { Cv2.Circle(mat, c1, 10, new Scalar(0x3c, 0x14, 0xdc), -1); } foreach (Point2i c2 in centres2) { Cv2.Circle(mat, c2, 10, new Scalar(0xff, 0x00, 0x00), -1); } if (localiseFlags.gameState != GameState.Unstart) { for (int i = 0; i < localiseFlags.currPersonNum; ++i) { int x10 = localiseFlags.posPersonStart[i].X - 8; int y10 = localiseFlags.posPersonStart[i].Y - 8; Cv2.Rectangle(mat, new Rect(x10, y10, 16, 16), new Scalar(0x00, 0xff, 0x00), -1); } } //Cv2.Merge(new Mat[] { car1, car2, black }, merged); //Cv2.ImShow("binary", merged); } }
public Tracker() { InitializeComponent(); //UI label_RedBG.SendToBack(); label_BlueBG.SendToBack(); label_RedBG.Controls.Add(label_CarA); label_RedBG.Controls.Add(labelAScore); label_BlueBG.Controls.Add(label_CarB); int newX = label_CarB.Location.X - label_BlueBG.Location.X; int newY = label_CarB.Location.Y - label_BlueBG.Location.Y; label_CarB.Location = new System.Drawing.Point(newX, newY); label_BlueBG.Controls.Add(labelBScore); newX = labelBScore.Location.X - label_BlueBG.Location.X; newY = labelBScore.Location.Y - label_BlueBG.Location.Y; labelBScore.Location = new System.Drawing.Point(newX, newY); label_GameCount.Text = "上半场"; // Init flags = new MyFlags(); flags.Init(); flags.Start(); capture = new VideoCapture(); // threadCamera = new Thread(CameraReading); capture.Open(0); flags.cameraSize.Width = capture.FrameWidth; flags.cameraSize.Height = capture.FrameHeight; flags.showSize.Width = pbCamera.Width; flags.showSize.Height = pbCamera.Height; ptsShowCorners = new Point2f[4]; cc = new CoordinateConverter(flags); localiser = new Localiser(); timeCamNow = DateTime.Now; timeCamPrev = timeCamNow; ball = new Point2f[0]; car1 = new Point2i(); car2 = new Point2i(); buttonStart.Enabled = true; buttonPause.Enabled = false; buttonEnd.Enabled = false; button_AReset.Enabled = false; button_BReset.Enabled = false; validPorts = SerialPort.GetPortNames(); alreadySet = false; //Game.LoadMap(); game = new Game(); if (capture.IsOpened()) { capture.FrameWidth = flags.cameraSize.Width; capture.FrameHeight = flags.cameraSize.Height; capture.ConvertRgb = true; timer100ms.Interval = 75; timer100ms.Start(); //Cv2.NamedWindow("binary"); } }