поиск точного фрагмента изображения
есть CDC* чужого окна.
Нужно найти 5 точных картинок, размером примерно 200х50 пикселей.
Интересует абсолютная идентичность.
Самое интересное, что это все прекрасно работает в Autohokey и AutoIt посредством бибилиотеки imageSearch.
Как это сделать на с++ ?
И да, это все будет крутиться каждую секунду. Это возможно?
p.s. Много читал про openCV, но кажется это больше для распознавания.
Я, все-таки, надеюсь что есть более изящное решение, чем 200*50*5 = 50 000 GetPixel в секунду.
Может кто-то подскажет еще варианты ?
Может есть вариант с DirectX ? (это графическая игра)
И неужели у такого грандиозного языка нет библиотеки с поиском картинок ?
К тому же, GetPixel — это довольно долго, слишком много накладных расходов. Легче получить доступ к битовой карте и сравнивать всё самому, это будет гораздо быстрее.
теоретически я могу сам набросать код.
Но я сильно сомневаюсь что это быстро будет работать.
Сейчас раздумываю ... может это сделать по 5-7 контрольным точкам ?
Даже это, имхо, будет затратно.
В смысле, брать не всю зону 200×50, а поменьше? В принципе, вариант. Развивая идею дальше, можно будет найти «предположительные» зоны, а их уже будет проще обработать (быстрее), сравнивая с искомой картинкой.
Вряд ли это будет затратно. Чесслово, сравнение даже картинки 1920×1080 (если не пользоваться GetPixel, конечно :D) на совпадение с несколькими точками — не такая долгая операция. Это получается 2 млн. точек, и если считать, что частота одного ядра процессора (а ведь можно распараллелить ;-)) — 2 ГГц, то получаем фору на 1000 операций сравнения. Т.к. на самом деле так много не потребуется, то в 1 с ты вложишься с остатком даже.
Мне уже интересно стало такое самому попробовать реализовать ☺
Мне уже интересно стало такое самому попробовать реализовать ☺
ну на самом деле там большие накладные расходы будут.
На ассемблере я бы это смог релизовать с прямым доступом к памяти,я еще в школе нечто подобное делал, ибо на ПОИСКЕ 2 каждый такт был на счету но на С под винду это будет грустновато.
Ты бы не мог подсказать как максимально быстро можно спроецировать копию экрана в доступную память ?
а дальше уже можно тестировать алгоритмы.
CBitmap *pCBmp=pCDC->GetCurrentBitmap();
if(pCBmp){
BITMAP BMP;
if(pCBmp->GetBitmap(&BMP){
//Тут дальнейшая обработка
}
}
}