Найдите красный прямоугольник на игровом экране - PullRequest
1 голос
/ 23 февраля 2012

Я знаю, что было много тем, похожих на эту, но ни одна из них не имела точного ответа на то, что я ищу, поэтому, пожалуйста, если кто-нибудь знает, а также я делаю это на C #.

Вы, наверное, знаете (FPS) игры, и на игровом экране с разрешением скажем 1024x768 мне нужно найти красный прямоугольник (который является врагом) и навести на него мышь. Поэтому моя главная проблема - найти этот красный прямоугольник. Итак, вот что я пробовал до сих пор:

Я попробовал AForge и исчерпал память:

ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0);
TemplateMatch[] matchings = tm.ProcessImage(image1.Clone(r,
        System.Drawing.Imaging.PixelFormat.Format24bppRgb), image2);

Я использовал CopyfromScreen для создания image1, а image2 - это мой шаблон.

Я попробовал LockBits, поэтому я могу создать массив двумерного кода для растрового изображения и найти код для красного цвета и попытаться идентифицировать, если это прямоугольник, но идея кажется очень сложной, застрял здесь на 4 дня Теперь.

В Интернете полно информации об этом, но чем больше я углубляюсь, тем больше я запутываюсь: (

В любом случае, пожалуйста, помогите мне здесь:

1 Ответ

0 голосов
/ 07 марта 2014

Ну, во-первых, я должен сказать, что это, вероятно, будет медленно, поэтому, если красный прямоугольник движется быстро, вам понадобится другое решение. C ++, CUDA и т.д ...

Во-первых: Сохраните изображение красного прямоугольника. Определите область возможного расположения красного прямоугольника.

Шаги:

  1. Захват игрового изображения (вы можете использовать Graphics CopyFromScreen). Скопируйте только область, которой может быть красный прямоугольник, чтобы сократить время обработки.
  2. Используйте EmguCV MatchTemplate, чтобы найти положение красного прямоугольник.
  3. Переместите мышь в положение.
  4. Какой-то поток сна и повтор 1 ...

Для обработки изображения используйте EmguCV
Для управления мышью используйте MouseKeyboardActivityMonitor

Замечание по ускорению: EmguCV теперь имеет некоторую поддержку CUDA, поэтому вы можете попробовать использовать версию метода CUDA.

        //You can check if a 8bpp image is enough for the comparison, 
        //since it will be much more faster. Otherwise, use 24bpp images.
        //Bitmap pattern = "YOUR RED RECTANGLE IMAGE HERE!!"
        Point location = Point.Empty;
        //source is the screen image !!
        Image<Bgr, Byte> srcBgr = new Image<Bgr, Byte>(source);
        Image<Bgr, Byte> templateBgr = new Image<Bgr, Byte>(pattern);

        Image<Gray, Byte> src;
        Image<Gray, Byte> template;
        src = srcBgr.Convert<Gray, Byte>();
        template = templateBgr.Convert<Gray, Byte>();

        Image<Gray, float> matchFloat;
        matchFloat = src.MatchTemplate(template, TM_TYPE.CV_TM_CCOEFF_NORMED);
        if (debug)
        {
            //matchFloat.Save(@"match.png");
            //Process.Start(@"D:\match.png");
        }
        //Gets the max math value
        double max;
        double[] maxs, mins;
        Point[] maxLocations, minLocations;
        matchFloat.MinMax(out mins, out maxs, out minLocations, out maxLocations);
        max = maxs[0];

        if (max > threshold)
        {
        location = maxLocations[0];
        //Point the mouse... Do your stuff
...