![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| xaOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2005 Репутация: нет Всего: нет |
Ситуация такая - есть скриншот экрана (Картинка1), и маленькая картинка например 20 на 20 пикс (Картинка2), как можно быстро определить, что на Картинке1 есть Картинка2?
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Уменьшить и сравнить попиксельно.
Если уменьшение проводилось по тому же алгоритму, то совпадет. Если нет, то нужно проверять с учетом допустимой погрешности (экскриментальным путем). |
|||
|
||||
| xaOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2005 Репутация: нет Всего: нет |
Имелось ввиду найти на Картинке1 - Картинку 2, где Картинка 2 может быть элементом Картинки 1
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Быстро никак. Только перебором.
Естественно, если прерывать перебор при первом несовпадении, то будет не так медленно. Ускорить можно диагональным сравнением. Но это все с учетом, что скриншот и картинка не испорчены джпегом. |
|||
|
||||
| xaOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2005 Репутация: нет Всего: нет |
Вот наваял, не подскажете как ускорить можно?
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
1. Создать два array[0..x,0..y] or dword; Прописать в них 4-байтные цвета каждой картинки. Обращение к массивам будет быстрее и можно будет сразу сравнивать цвета целиком, а не по составляющим.
2. Если речь идет и скриншотах, то быстрое отсеивание можно реализовать при сканировании главной диагонали, т.к. окна располагаются прямоугольно, то повторение вертикальных и горизонтальных пикселей происходит довольно часто, а вот диагональных нет. Если уж диагональ полностью совпала, то только тогда проводить полное сравнение. 3. Все написать в одной процедуре. Тогда не потребуется подготавливать данные для процедуры сравнения - сразу брать смещение по циклу. |
|||
|
||||
| xaOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2005 Репутация: нет Всего: нет |
Насчет одной процедуры что то никак дойти не могу как это сделать в одной |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Для начала создай два массива, чтобы использовать их, а не сканлайны.
А объеденить просто - все, что у тебя написано внутри функции, запихни внутрь бегина. Заведи флаг выхода. Вместо Exit, используй break. Замени третий for на while. |
|||
|
||||
| xaOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2005 Репутация: нет Всего: нет |
После долгих мучений и напряжения серого вещества у меня получилась довольно быстрая фунция, при размере Картинки 1 - 1024 758, а в второй - 100 20, скорость меньше 1 сек:
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |