Существуют ли какие-либо библиотеки для сравнения небольшого изображения с захватом экрана и возврата списка координат x, y, где оно находится? - PullRequest
2 голосов
/ 29 декабря 2011

это довольно грубая область (сравнение нечеткой логики), которая, так сказать, намного выше моей зарплаты.

Я пытаюсь написать программу, которая будет обнаруживать морковь (и другие овощи)на экране из игры и возвращать совпадающие координаты x, y для каждого найденного совпадения.

Цель состоит в том, чтобы отслеживать каждый раз, когда растет овощ (в 5 раз), и в конечном итоге автоматизировать полив / сбор овощей (как только вы увидите скриншоты, это будет иметь больше смысла).

Iпопытался использовать код сравнения изображений, расположенный по адресу http://sites.google.com/site/serinolorenzo/blackmask

, на самом деле он работает безупречно при поиске на этом скриншоте (и захваты рабочего стола) http://imageshack.us/photo/my-images/24/mac8.png/

для экземпляров этого изображения ... http://imageshack.us/photo/my-images/249/carrotplant.png/

Он находит и возвращает несколько координат меню «Семена моркови».

Однако, когда я приступаю к обнаружению овощей (мясо и картофель того, что нужно сравнивать), он не может найтисовпадение.

Я пробовал различные "морковные" скриншоты, совсем недавно ... http://imageshack.us/photo/my-images/829/carrotlight1t.png/

к изображению http://imageshack.us/photo/my-images/408/macnolight1.png/

(мне пришлось повернутьв игре выключил освещение, когда я попал сюда, чтобы цвета оставались неизменными независимо от времени игры.

Я подумал (просматривая исходный код для сравнения изображений), что черный будет игнорироваться, поэтому я 'я точно не уверенЭто происходит, но сейчас он просто не найдет соответствия, даже если я установлю пороги ниже.

Существуют ли (хорошо документированные) библиотеки для этого, так как кодирование с нуля - это нечтоЯ не могу сделать в данный момент.

За исключением этого (и если кто-то читает, у него есть время), вы можете увидеть, где я иду не так?

Код, который я используюсделать тестирование это ...

    public void tester()
    {
        Bitmap screenshot;
        screenshot = new Bitmap(@"c:\MyMercurial\ATITDVeggieMacro\ATITDVeggieMacro\Images\macnolight1.bmp");

        Bitmap searchFor;
        searchFor = new Bitmap(@"c:\MyMercurial\ATITDVeggieMacro\ATITDVeggieMacro\Images\wholecarrot.bmp");
        int ac1;
        int ac2;

        ArrayList test = BlackMask.Search(screenshot,searchFor,
            0,10,75,5,80,20,100,true,out ac1,out ac2);

        statusUpdate = ac1.ToString()+"good,"+ ac2.ToString()+" bad/ X=";
    }

(я просто обновляю пути к файлам, когда хочу изменить изображения).

(Бонусный вопрос, как мне использовать относительные пути, чтобы сказатьэто просто пойти вверх по двум каталогам, а затем вниз в папку «Изображения», я вообще не могу вспомнить относительные сочетания путей)

Спасибо за любую помощь, ребята, это заставило меня хлопнуть себя по лбу.

1 Ответ

1 голос
/ 30 декабря 2011

Для интеллектуальной обработки изображений в .NET вы можете использовать AForge.NET . Также есть OpenCV , но нет никаких привязок .NET, которые я знаю о себе (хотя, похоже, они есть для Java ...). Как только вы выясните, какая библиотека, я уверен, что вы сможете найти дополнительные статьи через Google об их использовании (помимо стандартных примеров)

Я никогда не играл в ATITD, однако, если бы вы выяснили различные особенности его разработки, это могло бы пролить некоторый свет на то, как вы можете подойти к этой проблеме в совершенно ином направлении. Например, если их клиентское приложение связано с DLL-библиотекой времени выполнения MS C, возможно, оно было разработано на C / C ++ (или, может быть, с каким-то другим языком, структура которого работает на ядре C / C ++). В конечном итоге вы можете просто манипулировать памятью программы, если узнаете, как она хранит копию состояния игры в памяти клиента (при условии, что это не какой-то видеопоток, как в OnLive). Если вы выясните, какую платформу рендеринга они используют, OpenGL, DX и т. Д., Вы сможете сделать захват изображения более эффективно (и, возможно, без такого количества артефактов, как трава и тому подобное, что вам придется маскировать себя) через DLL-хуки / прокси .

...