예제 #1
0
        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();
        }
예제 #2
0
        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];
            }
        }
예제 #3
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);
        }
예제 #4
0
        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;
        }
예제 #5
0
        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);
                            }
        }
예제 #6
0
        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");
            }
        }