Распознавание области экрана для определения местоположения поля на экране - PullRequest
7 голосов
/ 23 февраля 2011

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

Итак, у меня есть растровое изображение, которое представляет область моего экрана (я назову эту область BUTTON1). Компоновка экрана могла немного измениться, или экран мог быть перемещен на рабочем столе - поэтому я не могу использовать прямую позицию. Сначала я должен найти, где текущая позиция BUTTON1 находится на экране в реальном времени. (Я пытался опубликовать фотографии этого, но я думаю, что не могу, потому что я новый пользователь ... Я надеюсь, что описание проясняет ...)

Я думаю, что Sikuli использует OpenCV под одеялом. Так как это открытый исходный код, я думаю, я мог бы перепроектировать его и выяснить, как делать то, что они делают в OpenCV, вместо этого реализуя его в Emgu.CV - но мой Java не очень силен.

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

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

Итак, вместо этого я думаю:

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

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

Это совершенно безумно? У кого-нибудь есть простой пример того, как можно использовать Aforge.Net или Emgu.CV для этого? (Или как конкретизировать шаг B выше ...?)

Спасибо!

1 Ответ

1 голос
/ 24 июля 2011

Вообще говоря, звучит так, будто вы хотите базового распознавания объектов. У меня нет опыта работы с SIKULI, но существует несколько способов распознавания объектов (сопоставление шаблонов на основе Edge и т. Д.). Это значит, что вы можете использовать только прямое сопоставление гистограммы.

http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx

Эта страница должна показать вам, как использовать AForge.net для получения гистограммы изображения. Вы бы просто осуществили поиск методом перебора, используя что-то вроде этого:

Bitmap ImageSearchingWithin=new Bitmap("Location of image"); //or just load from a screenshot or whatever
for (int x = 0; x < ImageSearchingWithin.Width - WidthOfImageSearchingFor; ++x)
{
    for (int y = 0; y < ImageSearchingWithin.Height - HeightOfImageSearchingFor; ++y)
    {
        Bitmap MySmallViewOfImage = ImageSearchingWithin.Clone(new Rectangle(x, y, WidthOfImageSearchingFor, HeightOfImageSearchingFor), System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    }
}

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

...