Как я могу получить прямоугольные области различий между двумя изображениями? - PullRequest
1 голос
/ 20 марта 2012

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 20 марта 2012

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

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


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

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

0 голосов
/ 26 ноября 2013

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

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

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

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

Приветствия!

0 голосов
/ 20 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...