Пример #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);
            }


            List <GameObject> list_obj = FindByWhiteMask(img, img_debug); // определение белых контуров

            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(config.Width, config.Height));

                Cv2.Line(dest, screenLeft, screenRight, Colors.green, 3);
                Cv2.Circle(dest, screenCenter, 5, new Scalar(255, 255, 0), -1);
                Cv2.ImShow("rotated", dest);
            }
            Console.WriteLine($"ANGLE= {angle}");

            //Mat grey = new Mat();
            //Cv2.CvtColor(img, grey, ColorConversionCodes.BGR2GRAY);
            //Cv2.Canny(grey, grey, 100, 100 * 2);
            //Cv2.ImShow("Canny", grey);

            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}");
            }
            else
            {
                Console.WriteLine("SKIP: player not found");
                skip = true;
            }
            //rgb(153, 0, 255)


            //line_center = null;
            if (!skip)
            {
                // в зависимости от положения коробля определяю точку для определения линии
                //Point diff = new Point(player.pt_up.X, player.pt_up.Y - 10);

                //if (diff.X > screenCenter.X) { diff.X -= 10; }
                //else { diff.X += 10; }
                //Mat[] rgb = img.Split();
                //TestPointByMask(mask_white, diff);
                //TestPointByMask(mask_white, new Point(30, 30));

                int offsetX = (int)(10); if (player.pt_up.X > screenCenter.X)
                {
                    offsetX = (int)(-10);
                }
                Point diff = GetCheckedPointByMask(mask_white, player.pt_up, offsetX, (int)(-10), false);

                //Cv2.ImShow("thresh2", mask_white);
                //TestPointByMask(rgb[2], diff);



                if (diff.X >= 0 && diff.X <= config.Width &&
                    diff.Y >= 0 && diff.Y <= config.Height)
                {
                    line_center = FindLine(img, diff, img_debug, "center");
                }
                else
                {
                    Console.WriteLine("SKIP: line center");
                    skip = true;
                }
            }

            // считаю середину слева
            //line_left = null;
            if (!skip)
            {
                Point mid_left = new Point(
                    (line_center.pt_up.X + line_center.pt_left.X) / 2,
                    (line_center.pt_up.Y + line_center.pt_left.Y) / 2);

                // смещаю линию на 10 пикселей вверх и вбок
                //mid_left.X -= 30;
                //mid_left.Y -= 30;
                mid_left = GetCheckedPointByMask(line_center.mask, mid_left, (int)(-30), (int)(-30), true);


                if (mid_left.X >= 0 && mid_left.X <= config.Width &&
                    mid_left.Y >= 0 && mid_left.Y <= config.Height)
                {
                    if (config.Preview > 0)
                    {
                        Cv2.Circle(img_debug, mid_left, 6, new Scalar(20, 70, 25), -1);
                    }
                    line_left = FindLine(img, mid_left, img_debug, "left");
                }
                else
                {
                    Console.WriteLine("SKIP: line left");
                    skip = true;
                }
            }

            // считаю середину справа
            //line_right = null;
            if (!skip)
            {
                Point mid_right = new Point(
                    (line_center.pt_up.X + line_center.pt_right.X) / 2,
                    (line_center.pt_up.Y + line_center.pt_right.Y) / 2);

                // смещаю линию на 10 пикселей вверх и вбок
                //mid_right.X += 30;
                //mid_right.Y -= 30;
                mid_right = GetCheckedPointByMask(line_center.mask, mid_right, (int)(30), (int)(-30), true);

                if (mid_right.X >= 0 && mid_right.X <= config.Width &&
                    mid_right.Y >= 0 && mid_right.Y <= config.Height)
                {
                    if (config.Preview > 0)
                    {
                        Cv2.Circle(img_debug, mid_right, 6, new Scalar(20, 70, 25), -1);
                    }
                    line_right = FindLine(img, mid_right, img_debug, "right");
                }
                else
                {
                    Console.WriteLine("SKIP: line right");
                    skip = true;
                }



                mask_white.Release();
                if (player != null)
                {
                    player.contour.Release();
                }
            }
        }