Как я могу получить прямоугольные области разницы между двумя изображениями?

Я чувствую, что у меня очень типичная проблема со сравнением изображений, и мои Google не дают ответов.

Я хочу передавать неподвижные изображения рабочего стола каждые X секунд. В настоящее время мы отправляем новое изображение, если старое и новое отличаются хотя бы на один пиксель. Очень часто меняются только очень незначительные изменения, например, часы или значок, и было бы здорово, если бы я мог просто отправить измененную часть на сервер и обновить изображение (намного меньше пропускной способности).

План, который я вижу, состоит в том, чтобы получить прямоугольник области, которая изменилась. Например, если часы изменились, сделайте снимок экрана с наименьшим прямоугольником, охватывающим изменения, и отправьте его на сервер вместе с его координатой (x, y). Затем сервер обновит старое изображение, наложив прямоугольник с указанной координатой.

Есть ли какой-нибудь алгоритм или библиотека, которая выполняет это? Я не хочу, чтобы это было идеально, скажем, я всегда буду отправлять один прямоугольник, который охватывает все изменения (даже если много меньших прямоугольников было бы более эффективным).

Моя другая идея заключалась в том, чтобы получить разницу между новыми и старыми изображениями, которые сохраняются как серия преобразований. Затем я бы просто отправил серию преобразований на сервер, который затем применил бы это к старому изображению, чтобы получить новое изображение. Не уверен, что это вообще возможно, просто мысль.

Есть идеи? Библиотеки, которые я могу использовать?


person seibelj    schedule 19.03.2012    source источник
comment
Есть ли причина, по которой вы делаете это вручную, а не используете VNC или что-то в этом роде?   -  person ire_and_curses    schedule 20.03.2012
comment
Есть очень веская причина, по которой мы не можем передавать видео или использовать VNC и т. д., это должна быть серия изображений.   -  person seibelj    schedule 20.03.2012


Ответы (3)


Сравнивать каждый пиксель предыдущего кадра с каждым пикселем следующего кадра и отслеживать, какие пиксели изменились?

Поскольку вы ищете только одно поле, чтобы охватить все изменения, вам на самом деле нужно отслеживать только min-x, min-y (не обязательно из одного и того же пикселя), max-x , и макс-у. Эти четыре значения дадут вам края вашего прямоугольника.


Обратите внимание, что это задание (сравнение двух кадров) действительно должно быть перенесено на графический процессор, который мог бы сделать это значительно быстрее, чем центральный процессор.

Также обратите внимание, что то, что вы пытаетесь сделать, по сути, является доморощенным алгоритмом сжатия потокового видео без потерь. Использование одной из существующих библиотек было бы не только намного проще, но и, вероятно, гораздо более производительно.

person BlueRaja - Danny Pflughoeft    schedule 19.03.2012

Это с точки зрения алгоритмов. Не уверен, что это проще реализовать.

В основном XOR двух изображений и сжатие с использованием любого алгоритма теории информации (кодирование Хаффмана?)

person ElKamina    schedule 20.03.2012

Я знаю, что очень поздно отвечаю, но сегодня я нашел этот вопрос.

Я провел некоторый анализ различий изображений, но код был написан для java. Пожалуйста, ознакомьтесь с приведенной ниже ссылкой, которая может помочь

Как найти прямоугольник разницы между двумя изображениями< /а>

Код находит различия и сохраняет прямоугольники в Linkedlist. Вы можете использовать связанный список, который содержит прямоугольники, чтобы исправить различия в базовом изображении.

Ваше здоровье !

person Nandhan    schedule 26.11.2013