Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2015, 19:02   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Простой способ распознавания образов путем сравнения с оригиналом

Похожую тему я уже писал, но задача немного изменилась.

На delphi7 собираюсь делать скриншоты из окна другой программы.
Это окно будет иметь фиксированный размер.
В этом окне будут 3 области размерами 57x124 pix.
Может быть до примерно 1000 вариантов изображений этих участков.
Допустим я смогу собрать базу всех этих вариантов изображений в bmp.

Совпадение позиционирования изображений с оригиналом должно быть очень высоким примерно( разница в пикселях расположения) от 0 до 3х 4х по х и y, но думаю будет реально 1-2.
Но сдесь еще проблемка которая ухудшит точность половины картинок. Около 500 картинок будут иметь худшую точность ввиду того что в программе они имею анимацию ( некоторое поблескивание и так далее, вполне значительное).

Вопрос в том каким простым способом сравнивать изображения.
Я не разбираюсь в вопросах распознавания образов.

Мой вариант №1:
Просто в каждом рисунке в базе прочитать каждый пиксель и просуммировать все значения цветов по отдельности R,G и B.
А при сравнении осуществлять такой же анализ RGB и путем сравнения этих 3х цифр c некоторым приближением определять нужный рисунок.
Но пока что у меня нет базы и я не знаю будет ли достаточная точность для однозначного определения рисунков.
Illusiony вне форума Ответить с цитированием
Старый 02.02.2015, 20:09   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что за "другая программа"? Зачем так извращаться с ней?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.02.2015, 21:11   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Что значит зачем? мне нужно получить скриншот окна другой программы.
Для моего "проэктика" , я дал небольшое описание в одной из тем, но это не касается этой темы.
Illusiony вне форума Ответить с цитированием
Старый 02.02.2015, 21:22   #4
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Цитата:
Около 500 картинок будут иметь худшую точность ввиду того что в программе они имею анимацию
Делайте конверт в статическое изображение.
Цитата:
Просто в каждом рисунке в базе прочитать каждый пиксель и просуммировать все значения цветов по отдельности R,G и B
Не советую. Лучше работать с чёрно белым изображением, если нет потери критически важных данных изображения.
WinCoder вне форума Ответить с цитированием
Старый 02.02.2015, 21:26   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому что скорее всего есть более простые варианты решения задачи, чем скриншоты и распознавание.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.02.2015, 21:30   #6
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Обнаружил еще проблему.
В рисунка базы формат bmp 24 бит, при скриншотах из delphi 32 бит.
Делаю скриншоты так:
Код:
procedure ScreenShot(activeWindow: bool; destBitmap : TBitmap) ;
 var
    w,h : integer;
    DC : HDC;
    hWin : Cardinal;
    r : TRect;
 begin
    if activeWindow then
    begin
      hWin :=  GetForegroundWindow;
      dc := GetWindowDC(hWin) ;
      GetWindowRect(hWin,r) ;
      w := r.Right - r.Left;
      h := r.Bottom - r.Top;
    end
    else
    begin
      hWin := GetForegroundWindow;
      dc := GetDC(hWin) ;
      w := GetDeviceCaps (DC, HORZRES) ;
      h := GetDeviceCaps (DC, VERTRES) ;
    end;

    try
     destBitmap.Width := w;
     destBitmap.Height := h;
     BitBlt(destBitmap.Canvas.Handle,
            0,
            0,
            destBitmap.Width,
            destBitmap.Height,
            DC,
            //0,
            //0,
            16,
            38,
            SRCCOPY) ;
    finally
     ReleaseDC(hWin, DC) ;
    end;
 end;

procedure TForm1.btn2Click(Sender: TObject);
var
  path:string;
  b:TBitmap;
begin
  Sleep(5000);
   //path:= ExtractFilePath(Application.ExeName) + '/Screenshot/';
   b := TBitmap.Create;
   try
     ScreenShot(TRUE, b) ;
    // b.SaveToFile(path + 'Screenshot_1.png');
    b.SaveToFile('C:\1.bmp');
   finally
     b.FreeImage;
     FreeAndNil(b) ;
   end;
end;
Как сделать чтобы в 24 бита изображение получать?
Сохранять изображение мне тольок для отладки нужно, нужно чтобы в destBitmap оно было 24 битное, для сравнения.

Последний раз редактировалось Illusiony; 02.02.2015 в 21:33.
Illusiony вне форума Ответить с цитированием
Старый 02.02.2015, 21:31   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Потому что скорее всего есть более простые варианты решения задачи, чем скриншоты и распознавание.
Ну да, наверно можно перехватывать пакеты поступающие к той программе, но это еще больше нужно узнавать и еще больше гемороя от этого.
Illusiony вне форума Ответить с цитированием
Старый 02.02.2015, 21:38   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Есть и другие варианты. Например, может быть можно средствами винапи достать из нее что нужно.

Что за программа-то такая уникальная? Что она делает?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.02.2015, 21:42   #9
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Это программа игры Hearthstone. Мне нужно данные о том какие 3 карты в ней в данный момент показаны для выбора на арену.

Это пояснение врятли поможет.
Как туда передаются данные от сервера я не представляю. Логи доступные анализировал, достал тока информацию о картах во время боя, а эту информацию не нашел.

Цитата:
Сообщение от WinCoder Посмотреть сообщение
Делайте конверт в статическое изображение.

Не советую. Лучше работать с чёрно белым изображением, если нет потери критически важных данных изображения.
В смысле конветер?
В той программе половина изображений могут быть с анимацией. Я никак не могу на ту программу ( игра Hearthstone) както повлиять. Я лишь перемещаю окно в координаты 0,0 делаю скриншот.

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

Я и не собирался с этим заморачиваться, надеясь что точности хватит для различения изображений.

Я не знаю поможет ли мне winapi и не разбираюсь в этом.

Сами картинки в программе выполняют роль кнопок, их рамки изменяют цвет при наведении и кликабельны при нажатии по ним.

Последний раз редактировалось Illusiony; 02.02.2015 в 22:03.
Illusiony вне форума Ответить с цитированием
Старый 03.02.2015, 02:26   #10
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Как в 24 бит преобразовать нашел.
Illusiony вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распознавание путем сравнения с прототипом Illusiony Общие вопросы Delphi 13 09.01.2015 18:49
Более быстрый и простой способ Gefo PHP 1 23.12.2012 10:12
Нейронные сети для распознавания образов ELL Помощь студентам 0 29.03.2012 21:03
Самый простой способ работы с файлами wwe2012 Общие вопросы C/C++ 4 28.03.2011 22:12
Самый простой способ сравнения. Mixasik Общие вопросы Delphi 6 21.04.2010 12:04