Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

поиск точного фрагмента изображения

87K
01 марта 2017 года
lngvar
4 / / 01.03.2017
Добрый день, перерыл весь рунет, но так и не нашел практичного способа решить свою задачу.

есть CDC* чужого окна.
Нужно найти 5 точных картинок, размером примерно 200х50 пикселей.
Интересует абсолютная идентичность.
Самое интересное, что это все прекрасно работает в Autohokey и AutoIt посредством бибилиотеки imageSearch.
Как это сделать на с++ ?

И да, это все будет крутиться каждую секунду. Это возможно?

p.s. Много читал про openCV, но кажется это больше для распознавания.
7
01 марта 2017 года
@pixo $oft
3.4K / / 20.09.2006
По-моему, это элементарно. Итак, у нас есть DC чужого окна размерами H×W и искомая картинка (картинки) размерами h×w. Решение задачи в лоб — пробегаться по DC чужого окна в пределах (H−h)×(W-w) в поисках такой же точки, как и точка (0, 0) искомого изображения, и затем поточечное сравнение фрагментов. В принципе, для таких небольших картинок работать будет быстро.
87K
01 марта 2017 года
lngvar
4 / / 01.03.2017
Цитата: @pixo $oft
и затем поточечное сравнение фрагментов. В принципе, для таких небольших картинок работать будет быстро.

Я, все-таки, надеюсь что есть более изящное решение, чем 200*50*5 = 50 000 GetPixel в секунду.
Может кто-то подскажет еще варианты ?
Может есть вариант с DirectX ? (это графическая игра)
И неужели у такого грандиозного языка нет библиотеки с поиском картинок ?

7
03 марта 2017 года
@pixo $oft
3.4K / / 20.09.2006
Скорее всего, нет. Но всегда можно поискать сторонние библиотеки для поиска изображений. Только ты думаешь, что там не будет такой же выборки пикселей? :D
К тому же, GetPixel — это довольно долго, слишком много накладных расходов. Легче получить доступ к битовой карте и сравнивать всё самому, это будет гораздо быстрее.
7
05 марта 2017 года
@pixo $oft
3.4K / / 20.09.2006
Могу даже реализовать тебе свой алгоритм, если не найдёшь ничего получше. Только перед этим напишешь мне кое-какие подробности.
87K
05 марта 2017 года
lngvar
4 / / 01.03.2017
Цитата: @pixo $oft
Могу даже реализовать тебе свой алгоритм, если не найдёшь ничего получше. Только перед этим напишешь мне кое-какие подробности.

теоретически я могу сам набросать код.
Но я сильно сомневаюсь что это быстро будет работать.
Сейчас раздумываю ... может это сделать по 5-7 контрольным точкам ?
Даже это, имхо, будет затратно.

7
06 марта 2017 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: lngvar
по 5-7 контрольным точкам

В смысле, брать не всю зону 200×50, а поменьше? В принципе, вариант. Развивая идею дальше, можно будет найти «предположительные» зоны, а их уже будет проще обработать (быстрее), сравнивая с искомой картинкой.
Вряд ли это будет затратно. Чесслово, сравнение даже картинки 1920×1080 (если не пользоваться GetPixel, конечно :D) на совпадение с несколькими точками — не такая долгая операция. Это получается 2 млн. точек, и если считать, что частота одного ядра процессора (а ведь можно распараллелить ;-)) — 2 ГГц, то получаем фору на 1000 операций сравнения. Т.к. на самом деле так много не потребуется, то в 1 с ты вложишься с остатком даже.

Мне уже интересно стало такое самому попробовать реализовать ☺

87K
11 марта 2017 года
lngvar
4 / / 01.03.2017
Цитата: @pixo $oft
[quote=lngvar;98318]то получаем фору на 1000 операций сравнения. Т.к. на самом деле так много не потребуется, то в 1 с ты вложишься с остатком даже.

Мне уже интересно стало такое самому попробовать реализовать ☺

ну на самом деле там большие накладные расходы будут.
На ассемблере я бы это смог релизовать с прямым доступом к памяти,я еще в школе нечто подобное делал, ибо на ПОИСКЕ 2 каждый такт был на счету но на С под винду это будет грустновато.
Ты бы не мог подсказать как максимально быстро можно спроецировать копию экрана в доступную память ?
а дальше уже можно тестировать алгоритмы.

7
13 марта 2017 года
@pixo $oft
3.4K / / 20.09.2006
Точно не могу подсказать, но копай в сторону GDI. У тебя же CDC* будет, верно? Я тогда чуть почитал про этот класс, там вроде можно получить текущий CBitmap*, а от него плясать дальше. Если сам не разберёшься, напиши мне после 19:00 по Мск личное сообщение (как напоминалку), я снова поищу и напишу свои размышления.
7
13 марта 2017 года
@pixo $oft
3.4K / / 20.09.2006
В общем-то, не поленюсь сразу расписать идею. Выглядеть это будет примерно так ↓
 
Код:
void FindPix(CDC *pCDC){
    CBitmap *pCBmp=pCDC->GetCurrentBitmap();
    if(pCBmp){
        BITMAP BMP;
        if(pCBmp->GetBitmap(&BMP){
            //Тут дальнейшая обработка
        }
    }
}
Может статься, что GetBitmap() будет не самой лучшей функцией для получения пикселей, тогда воспользуйся GetDIBits, передав ей pCBmp::HBITMAP(). По идее, так должно сработать.
7
28 марта 2017 года
@pixo $oft
3.4K / / 20.09.2006
Напиши хоть, как успехи. Интересно, правильно ли я советовал вообще :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог