Сравнить экран и CBitmap
От: VSilchenko Австралия  
Дата: 14.10.13 03:30
Оценка:
Коллеги, после пары лет в QT нужно вернуться к софту, написанному на MFC и добавить кое-какую функциональность.
А именно: с заданной периодичностью нужно сравнивать содержимое окна с копией экрана в памяти.

Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды.

Подскажите, плз, в каком направлении двигаться.
Re: Сравнить экран и CBitmap
От: aloch Россия  
Дата: 14.10.13 05:28
Оценка:
Здравствуйте, VSilchenko, Вы писали:

VS>Подскажите, плз, в каком направлении двигаться.


Сравнивать _две_ копии экрана в памяти. И при чем здесь MFC и Qt?


Re[2]: Сравнить экран и CBitmap
От: VSilchenko Австралия  
Дата: 14.10.13 05:44
Оценка:
Здравствуйте, aloch, Вы писали:

A>Здравствуйте, VSilchenko, Вы писали:


VS>>Подскажите, плз, в каком направлении двигаться.


A>Сравнивать _две_ копии экрана в памяти. И при чем здесь MFC и Qt ?


MFC — сама програма написана с использованием MFC.
Qt — просто к тому, что после нескольких лет в Qt в MFC всё кажется непривычным и непонятным.

Насчет сравнивания в памяти — это и ежу понятно. Вопрос в том, как это сделать эффективно.

Если есть готовый пример — был бы весьма плагодарен.

А советы типа 'сравнить две копии' или 'гуглить GetDIBits' я и сам себе могу дать
Re[3]: Сравнить экран и CBitmap
От: aloch Россия  
Дата: 14.10.13 09:16
Оценка:
Здравствуйте, VSilchenko, Вы писали:

VS>А советы типа 'сравнить две копии' или 'гуглить GetDIBits' я и сам себе могу дать


Если можешь сам себе дать такие советы, то что спрашиваешь про GetPixel?

http://www.rsdn.ru/forum/src/696284.1
Автор: aGrey
Дата: 27.06.04
— это как сграбить экран

А сравнение зависит от того, что ты под этим понимаешь. Если просто похоже/непохоже, то сравниваем битмапы попиксельно (конечно не через GetPixel, а как две последовательности RGB(A) в памяти). Или что-то более сложное (найти зоны отличий/совпадений)?


Re: Сравнить экран и CBitmap
От: Serpuh фотомер.рф
Дата: 14.10.13 16:25
Оценка:
Здравствуйте, VSilchenko, Вы писали:
VS>Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды.
VS>Подскажите, плз, в каком направлении двигаться.

Как вариант можно сравнивать сумму argb пикселей экранов, и не подряд, а допустим через каждые 100.
Re[2]: Сравнить экран и CBitmap
От: aloch Россия  
Дата: 15.10.13 12:33
Оценка:
Здравствуйте, Serpuh, Вы писали:

S>Здравствуйте, VSilchenko, Вы писали:

VS>>Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды.
VS>>Подскажите, плз, в каком направлении двигаться.

S>Как вариант можно сравнивать сумму argb пикселей экранов, и не подряд, а допустим через каждые 100.


А зачем?


Re[3]: Сравнить экран и CBitmap
От: Serpuh фотомер.рф
Дата: 15.10.13 12:42
Оценка:
Здравствуйте, aloch, Вы писали:
S>>Как вариант можно сравнивать сумму argb пикселей экранов, и не подряд, а допустим через каждые 100.
A>А зачем?
Для ускорения операции, ТС пишет что надо делать в доли секунды. Суммирование можно быстро сделать, а оператор if будет всего один. Думаю качественно так можно определить менялась ли картинка. Хотя могу и ошибаться.
Re[4]: Сравнить экран и CBitmap
От: aloch Россия  
Дата: 15.10.13 14:42
Оценка: 1 (1)
Здравствуйте, Serpuh, Вы писали:

S>Для ускорения операции, ТС пишет что надо делать в доли секунды. Суммирование можно быстро сделать, а оператор if будет всего один. Думаю качественно так можно определить менялась ли картинка. Хотя могу и ошибаться.


Для ускорения лучше вообще ничего не сравнивать, чем сравнивать так.


Re[5]: Сравнить экран и CBitmap
От: Serpuh фотомер.рф
Дата: 15.10.13 15:05
Оценка:
Здравствуйте, aloch, Вы писали:
A>Для ускорения лучше вообще ничего не сравнивать, чем сравнивать так.
Лучше вообще ничего не писать, чем писать так.
Re[5]: Сравнить экран и CBitmap
От: Serpuh фотомер.рф
Дата: 15.10.13 15:14
Оценка:
Здравствуйте, aloch, Вы писали:
A>Для ускорения лучше вообще ничего не сравнивать, чем сравнивать так.
Ну и за одно каков твой молниеносный алгоритм сравнивания картинок с 2млн. пикселей?
Re[6]: Сравнить экран и CBitmap
От: aloch Россия  
Дата: 15.10.13 15:19
Оценка:
Здравствуйте, Serpuh, Вы писали:

S>Лучше вообще ничего не писать, чем писать так.


Ок. Почему именно через 100 пикселей, а не через 200 или 50 или 10? Почему не просто сравнивать все пиксели на диагоналях или скажем по спирали от центра против часовой стрелки с шагом 10?

Твое сравнение (и все остальные) не является сравнением, т.к. в очень большом количестве случаев оно скажет что все совпало, хотя совпадения нет и в помине! Зачем тогда вообще сравнивать?

Если нужен точный ответ, то сравнивать придется _все_ пискли, если точный ответ не нужен, то зачем сравнивать? можно просто использовать rnd() — так гораздо быстрее.

При этом если экран поменялся, то при последовательном сравнении мы быстро наткнемся на изменившейся пиксель. И скорее всего, если он изменился сейчас, то и в следующий раз изменится скорее всего он, или кто-то рядом с ним. Значит нужно в следующий начинать сравнение с него и его соседий. Вот это уже точный и при этом более быстрый способ.


Re[7]: Сравнить экран и CBitmap
От: Serpuh фотомер.рф
Дата: 15.10.13 15:42
Оценка:
Здравствуйте, aloch, Вы писали:
A>Ок. Почему именно через 100 пикселей, а не через 200 или 50 или 10? Почему не просто сравнивать все пиксели на диагоналях или скажем по спирали от центра против часовой стрелки с шагом 10?

A>Твое сравнение (и все остальные) не является сравнением, т.к. в очень большом количестве случаев оно скажет что все совпало, хотя совпадения нет и в помине! Зачем тогда вообще сравнивать?


Ок, давай брать через 2 пикселя, тогда все покажет. Только вопрос в том что надо отследить: что набили еще одну букву, или со студии на игруху переключились. Отсюда надо и плясать, т.к. самой дорогой по времени здесь все равно будет GetPixel().
Re[7]: Сравнить экран и CBitmap
От: Serpuh фотомер.рф
Дата: 15.10.13 15:52
Оценка:
Здравствуйте, aloch, Вы писали:
A>или скажем по спирали от центра против часовой стрелки с шагом 10?
A>можно просто использовать rnd() — так гораздо быстрее.

Да, про rnd() не знаю, но sin() cos() для спирали точно долгие операции.
Re[8]: Сравнить экран и CBitmap
От: aloch Россия  
Дата: 15.10.13 15:52
Оценка:
Здравствуйте, Serpuh, Вы писали:

S>Здравствуйте, aloch, Вы писали:

A>>Ок. Почему именно через 100 пикселей, а не через 200 или 50 или 10? Почему не просто сравнивать все пиксели на диагоналях или скажем по спирали от центра против часовой стрелки с шагом 10?

A>>Твое сравнение (и все остальные) не является сравнением, т.к. в очень большом количестве случаев оно скажет что все совпало, хотя совпадения нет и в помине! Зачем тогда вообще сравнивать?


S>Ок, давай брать через 2 пикселя, тогда все покажет. Только вопрос в том что надо отследить: что набили еще одну букву, или со студии на игруху переключились. Отсюда надо и плясать, т.к. самой дорогой по времени здесь все равно будет GetPixel().


Отследить нужно, как я понимаю все, все. Ответ "экран не изменился менее чем на 1% и мы считаем, что он не изменился" — это не ответ. А если отслеживать "со студии на игруху переключились", то отслеживать нужно не экран, а активный процесс, с которым работает USER.


Re[8]: Сравнить экран и CBitmap
От: aloch Россия  
Дата: 15.10.13 15:55
Оценка:
Здравствуйте, Serpuh, Вы писали:

S>Здравствуйте, aloch, Вы писали:

A>>или скажем по спирали от центра против часовой стрелки с шагом 10?
A>>можно просто использовать rnd() — так гораздо быстрее.

S>Да, про rnd() не знаю, но sin() cos() для спирали точно долгие операции.


Это будет квадратная спираль.


Re[9]: Сравнить экран и CBitmap
От: Serpuh фотомер.рф
Дата: 15.10.13 16:38
Оценка:
Здравствуйте, aloch, Вы писали:
A>Отследить нужно, как я понимаю все, все. Ответ "экран не изменился менее чем на 1% и мы считаем, что он не изменился" — это не ответ.
Значит нет другого выхода как делать 2 дампа памяти и побайтово их сравнивать. Другое дело, что это займет всю вычислительную мощь компа, но это уже детали.
Re: Сравнить экран и CBitmap
От: VSilchenko Австралия  
Дата: 15.10.13 19:26
Оценка:
Здравствуйте, VSilchenko, Вы писали:

VS>Коллеги, после пары лет в QT нужно вернуться к софту, написанному на MFC и добавить кое-какую функциональность.

VS>А именно: с заданной периодичностью нужно сравнивать содержимое окна с копией экрана в памяти.

VS>Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды.


VS>Подскажите, плз, в каком направлении двигаться.


После некоторых поисков было найдено и применено слегка модифицированое решение, описаное здесь: http://www.codeproject.com/Articles/16821/Comparing-Two-Bitmaps-for-Equality
Получилось и быстро, и относительно просто.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.