Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Быстрое сравнение картинок [Delphi, Windows]


Cash ©   (2006-05-20 07:05:00) 

Есть два Canvas с одинаковыми размерами. Один несет эталонное
изображение, а другой - тестируемое. Как можно очень быстро
проверить идентичность тестируемого изображения.

Ведь Pixels свойство довольно медленная штука!


Cash   (2006-05-24 17:20:00) [1]

Dimka Maslov ©   (24.05.06 16:31) [12]:
Бр-р-р-р... чет мне это быстрым не кажется! Да и к тому же я не знаю
как MD5 вычислять!

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


antonn   (2006-05-24 17:13:00) [2]

Dimka Maslov ©   (24.05.06 16:31) [12]
1. Через обращение к ScanLine вычислить MD5 эталона

хм... а зачем тогда сканлайн() ?


Dimka Maslov   (2006-05-24 16:31:00) [3]

1. Через обращение к ScanLine вычислить MD5 эталона
2. Потом вычислить MD5 второй картинки.
3. Сравнить, если MD5 двух картинок равны картинки абсолютно идентичны


Cash   (2006-05-20 16:15:00) [4]

MBo ©   (20.05.06 14:17) [8]:
Спасибо! Это как раз то, про что моя дырявая башка забыла!!! :)))

ЗЫ: А канвас веравно рулит! :)


antonn   (2006-05-20 16:10:00) [5]

Cash ©   (20.05.06 11:48) [3]
Вот представь себе если такая ерунда будет около 25-50-200 раз в секунду

создаешь битмап один раз, удалишь при закрытии программы.
а насчет скорости, я битмапы по 128*128 выводил с частотой больше, чем 300 (именно через сканлайн выводил, попиксельно), т.ч. ничего невозможного. Правда я процессор терзал неслабо:)


> antonn, ты с HBITMAP знаком?

нет, не знаком, не представился случай:)


Don Nikola   (2006-05-20 15:49:00) [6]

Вопрос, а какого рода картинки?
Если у тебя конечное количество эталонов, то можно проверять не весь битмап, а только один-два пикселя, что на порядки быстрее.
Так, например, можно дешево определить масть карты в java-игре на деньги ;)
И соответственно сделать авто-игрока, например в 21 с вероятностью в твою пользу.


MBo   (2006-05-20 14:17:00) [7]

Образец - Dib-bitmap нужного размера. Перед каждой проверкой делаешь его копию, отрисовываешь ы нее Bitblt нужный кусок с исходного контекста в xor-режиме. При этом одинаковые пикселы станут черными, разные - нечерными.
Остается только выполнить проверку одной картинки - для скорости используй ScanLine или http://www.delphimaster.ru/articles/pixels/index.html


Cash   (2006-05-20 13:59:00) [8]

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

Дак вот только проверка и осталась! Что то мне подсказывает, что там
вроде с маской или еще чем можно обойтись. Я попробовал с помощью Pixels
пройтись по всей области чужого окна, но это авантюра! Так медлено!

Уж очень неохота тревиальным перебором обходиться! :)


MBo   (2006-05-20 13:27:00) [9]

>Cash
С таким размером - не проблема проверять несколько тысяч раз в секунду
Откуда берется тестовое изображение?


Cash   (2006-05-20 13:01:00) [10]

MBo ©   (20.05.06 12:59) [4]:
16x16
24x24
32x32
64x64


MBo   (2006-05-20 12:59:00) [11]

какие размеры?


Cash   (2006-05-20 11:48:00) [12]

Эх, товарищ! Еслиб это все так просто было!
Вот представь себе если такая ерунда будет около 25-50-200 раз в секунду
срабатывать! (последняя цифра примерна)
Такую тревиальщину я бы и без вопросов всяких сделал. :)

antonn, ты с HBITMAP знаком? Или мож у HDC есть что в этом роде.
(в смысле проверки)


antonn   (2006-05-20 08:33:00) [13]

создать битмап, скопировать на него канвас, пройтись scanline()


antonn   (2006-05-20 08:33:00) [14]

...удалить битмап

забыл главное:)


Наверх

Титульная страница Поиск, карта сайта Написать письмо