Пример #1
0
        public void ProcessFrame(Mat source)
        {
            Mat img = source;

            //Mat img_debug= null;
            //bool skip = false;

            line_center = null;
            line_left   = null;
            line_right  = null;


            if (config.Preview != 0)
            {
                img_debug = new Mat();
                img.CopyTo(img_debug);
                //Cv2.Circle(img_debug, screenCenter, 5, new Scalar(255, 255, 0), -1);
                Cv2.Circle(img_debug, new Point(320, 240), 5, new Scalar(255, 255, 0), -1);
            }

            isGameOver = false;
            //angle = 0;

            Mat deleteme   = null;
            Mat mask_white = new Mat();

            Cv2.InRange(img, Colors.rgb220, Colors.rgb255, mask_white);
            // perform a series of erosions and dilations

            //Cv2.Dilate(mask_white, mask_white, null);
            //Cv2.Erode(mask_white, mask_white, new Mat(), iterations: 1);
            //if (config.Preview == 4)
            //Cv2.ImShow("threshSSS", mask_white);

            //Mat preview = new Mat();
            //if (config.Preview != 0)
            //{
            //    img.CopyTo(preview);
            //    Cv2.Circle(preview, screenCenter, 3, colors[4], -1);
            //}
            if (config.Preview == 4)
            {
                Cv2.ImShow("threshR", mask_white);
            }

            this.list_digits = new List <GameObject>();
            this.player      = new Player();

            PreProcessByWhiteMask(img, img_debug, mask_white);

            if (isGameOver)
            {
                Console.WriteLine("SKIP: Game Over detected!    ");
                return;
            }

            double angle  = GetAngle2(list_digits);
            double angle3 = -GetAngle3(list_digits);

            if (angle <= -45)
            {
                angle += 90;
            }
            else if (angle >= 45)
            {
                angle -= 90;
            }
            if (angle3 <= -45)
            {
                angle3 += 90;
            }
            else if (angle3 >= 45)
            {
                angle3 -= 90;
            }

            if (Math.Abs(angle - angle3) < 10)
            {
                angle = (angle + angle3) / 2;
            }

            Console.WriteLine($"angle={angle}, angle3={angle3}   ");

            if (config.Preview == 4 && img_debug != null)
            {
                Cv2.ImShow("pre rotate", img_debug);
            }

            if (angle != 0)
            {
                // https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_geometric_transformations/py_geometric_transformations.html
                Mat M    = Cv2.GetRotationMatrix2D(screenCenter, angle, 1);
                Mat dest = new Mat();
                Cv2.WarpAffine(img, dest, M, new Size(config.Width, config.Height));

                Cv2.Line(dest, screenLeft, screenRight, Colors.blue, 2);
                //Cv2.Circle(dest, screenCenter, 5, new Scalar(255, 255, 0), -1);
                if (config.Preview == 4)
                {
                    Cv2.ImShow("rotated", dest);
                }

                //img.Release();
                deleteme = dest;
                img      = dest;

                Mat mask_white2 = new Mat();
                Cv2.WarpAffine(mask_white, mask_white2, M, new Size(config.Width, config.Height));
                mask_white.Release();
                mask_white = mask_white2;
                if (config.Preview == 4)
                {
                    Cv2.ImShow("rotated_mask", mask_white);
                }

                if (config.Preview != 0)
                {
                    img_debug.Release();

                    img_debug = new Mat();
                    img.CopyTo(img_debug);
                    //Cv2.Circle(img_debug, screenCenter, 5, new Scalar(255, 255, 0), -1);
                    Cv2.Circle(img_debug, screenCenter, 5, Colors.cyan, -1);
                }

                if (player == null)
                {
                    player = new Player();
                }
                list_digits = new List <GameObject>();
                PreProcessByWhiteMask(img, img_debug, mask_white);
            } // */

            if (player != null)
            {
                if (config.Preview > 0)
                {
                    //Cv2.Circle(img_debug, player.pt_up, 5, new Scalar(255, 255, 0), -1); // purple
                    //Cv2.Circle(img_debug, player.pt_left, 5, new Scalar(255, 0, 153), -1); // light blue
                    //Cv2.Circle(img_debug, player.pt_right, 5, new Scalar(100, 0, 255), -1); // pink
                }
                Console.WriteLine($"Player found at {player.center}   ");
                //if (config.Preview > 0) ImUtils.PolylinesPoints2f(preview, rrpoints);
                if (config.Preview > 0)
                {
                    Cv2.Polylines(img_debug, player.points_approx, true, Colors.cyan, 2);
                }
                //if (config.Preview > 0) ImUtils.PolylinesPoints2f(img_debug, player.points_approx, colors[5]);
                //if (this.config.Preview > 0) Cv2.Circle(preview, pt_center, 2, new Scalar(255, 0, 0), -1);
                if (config.Preview > 0)
                {
                    Cv2.Circle(img_debug, player.center, 2, Colors.blue, -1);
                }
            }
            else
            {
                Console.WriteLine("SKIP: player not found   ");
                return;
            }



            //if (is)

            // необходимо проанализировать кадр, определить является ли конец игры (меню) или определить цифры


            /*
             * List<GameObject> list_obj = FindByWhiteMask(img, img_debug); // определение белых контуров
             * Player player = FindPlayer(list_obj);  // поиск игрока
             *                                     //Player player = null;
             * ocr.FindTimer(mask_white, list_obj);
             * double angle = GetAngle(img, img_debug, list_obj);
             * if (angle != 0)
             * {
             *  if (angle <= -45) angle += 90;
             *  else if (angle >= 45) angle -= 90;
             *  //angle = -8;
             *
             *  // https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_geometric_transformations/py_geometric_transformations.html
             *  Mat M = Cv2.GetRotationMatrix2D(new Point2f(img.Cols / 2, img.Rows / 2), angle, 1);
             *  Mat dest = new Mat();
             *  Cv2.WarpAffine(img, dest, M, new Size(configWidth, configHeight));
             *
             *  Cv2.Line(dest, screenLeft, screenRight, colors[2], 3);
             *  Cv2.Circle(dest, screenCenter, 5, new Scalar(255, 255, 0), -1);
             *  Cv2.ImShow("rotated", dest);
             *
             *
             * }
             * Console.WriteLine($"ANGLE= {angle}");
             * // */

            // сортировка
            // https://docs.microsoft.com/ru-ru/dotnet/api/system.collections.generic.list-1.sort?view=netcore-3.0
            // This shows calling the Sort(Comparison(T) overload using
            // an anonymous method for the Comparison delegate.
            // This method treats null as the lesser of two values.
            list_digits.Sort(delegate(GameObject el1, GameObject el2)
            {
                if (el1 == null && el2 == null)
                {
                    return(0);
                }
                else if (el1 == null)
                {
                    return(-1);
                }
                else if (el2 == null)
                {
                    return(1);
                }
                else
                {
                    return(el1.center.X.CompareTo(el2.center.X));
                }
            });

            ocr.FindTimer2(mask_white, list_digits);

            //
            int timerCenterX = GetTimerDimention(list_digits, img_debug);

            if (timerCenterX != -1 && player != null)
            {
                Point ptLineCenter = new Point(timerCenterX, 240);
                if (config.Preview > 0)
                {
                    Cv2.Circle(img_debug, ptLineCenter, 5, Colors.color1, -1);
                }

                GetLines(img, img_debug, mask_white, player, ptLineCenter);
            }
            // */
            mask_white.Release();
            if (deleteme != null)
            {
                deleteme.Release();
            }
        }