Пример #1
0
        internal bool SearchImageFromDict(Dictionary <string, Bitmap> buttonImages, out Point centerPoint, out string name)
        {
            window = autoIt.window;
            double threshold = 0.85;

            name        = null;
            centerPoint = new OpenCvSharp.Point();

            gameScreen_graphics.CopyFromScreen(window.X, window.Y, 0, 0, size_region);
            using Mat result     = new Mat();
            using Mat gameScreen = OpenCvSharp.Extensions.BitmapConverter.ToMat(gameScreen_bitmap);       //Сохраняем скрин экрана в mat
            using Mat mat_region_desktop_gray = gameScreen.CvtColor(ColorConversionCodes.BGR2GRAY);

            foreach (KeyValuePair <string, Bitmap> buttonImage in buttonImages)
            {
                using Mat searchImg      = OpenCvSharp.Extensions.BitmapConverter.ToMat(buttonImage.Value);
                using Mat searchImg_gray = searchImg.CvtColor(ColorConversionCodes.BGR2GRAY);

                Cv2.MatchTemplate(mat_region_desktop_gray, searchImg_gray, result, TemplateMatchModes.CCoeffNormed);                     //Поиск шаблона
                Cv2.Threshold(result, result, threshold, 1.0, ThresholdTypes.Tozero);
                Cv2.MinMaxLoc(result, out double minVal, out double maxVal, out OpenCvSharp.Point minLoc, out OpenCvSharp.Point maxLoc); //Поиск точки
                if (maxVal > threshold)
                {
                    centerPoint = new OpenCvSharp.Point(maxLoc.X + buttonImage.Value.Width / 2, maxLoc.Y + buttonImage.Value.Height / 2);
                    overlay.DrawRect(maxLoc.X, maxLoc.Y, buttonImage.Value.Width, buttonImage.Value.Height);
                    name = buttonImage.Key;
                    return(true);
                }
            }

            return(false);
        }
Пример #2
0
        internal bool SearchImageFromRegion(Bitmap bitmap, out Point f, Point start, Point end)
        {
            int widthRegion  = end.X - start.X;
            int heightRegion = end.Y - start.Y;

            double threshold = 0.9;        //Пороговое значение SearchImg

            f = new OpenCvSharp.Point();

            if (bitmap == null)
            {
                console.WriteLine("Error. Null bitmap.");
                return(false);
            }

            if (widthRegion < 1 || heightRegion < 1 || end.X > window.Width || end.Y > window.Height)
            {
                console.WriteLine("Error region.");
                return(false);
            }


            using Bitmap gameRegion_bitmap     = new Bitmap(widthRegion, heightRegion, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            using Graphics gameRegion_graphics = Graphics.FromImage(gameRegion_bitmap);

            System.Drawing.Size region = new System.Drawing.Size(end.X - start.X, end.Y - start.Y);
            gameRegion_graphics.CopyFromScreen(window.X + start.X, window.Y + start.Y, 0, 0, region);                    //делаем скрин экрана


            using Mat gameScreen           = OpenCvSharp.Extensions.BitmapConverter.ToMat(gameRegion_bitmap); //Сохраняем скрин экрана в mat
            using Mat gameScreenGrayRegion = gameScreen.CvtColor(ColorConversionCodes.BGR2GRAY);

            //Cv2.ImShow("Matches", gameScreen);
            //Cv2.WaitKey();

            using Mat searchImg     = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
            using Mat searchImgGray = searchImg.CvtColor(ColorConversionCodes.BGR2GRAY);

            using Mat result = new Mat();

            Cv2.MatchTemplate(gameScreenGrayRegion, searchImgGray, result, TemplateMatchModes.CCoeffNormed);                         //Поиск шаблона
            Cv2.Threshold(result, result, threshold, 1.0, ThresholdTypes.Tozero);
            Cv2.MinMaxLoc(result, out double minVal, out double maxVal, out OpenCvSharp.Point minLoc, out OpenCvSharp.Point maxLoc); //Поиск точки

            if (maxVal > threshold)
            {
                f = new OpenCvSharp.Point(maxLoc.X + start.X, maxLoc.Y + start.Y);
                // overlay.DrawRect(maxLoc.X + start.X, maxLoc.Y+ start.Y, bitmap.Width, bitmap.Height);
            }
            else
            {
                return(false);
            }

            return(true);
        }