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

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

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

1) доступно много свободного кода и библиотеки для сравнения изображений, но я просто не понимаю, какой из них использовать, а какой - для сравнения. так что просто направь меня по этому поводу.

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

Я много пытался получить информацию о моей точке 2, но ничего подобного не получил. я не нашел ни одной статьи, которая могла бы подсказать мне, как отправить разницу только по сети и объединить разницу с реальным изображением на другом конце

поэтому я ищу подробное обсуждение моего пункта 2 специально. Спасибо

3 ответа

Решение

Вам нужно будет выполнить три шага:

  1. Создайте разницу (DIFF) двух последовательных изображений. Сравнение двух пикселей на пиксель будет очень трудоемким. Вы должны использовать хорошо зарекомендовавшую себя библиотеку, такую ​​как OpenCV; проверьте библиотеку CV Emgu (http://www.emgu.com/) для.NET: AbsDiff () должен быть методом, который вы ищете. Результатом будет что-то вроде DIFF = IMG2 - IMG1.
  2. Отправьте DIFF через сеть. Это все еще полное изображение, но JPEG или PNG будут использовать все возможности сжатия, предполагая, что это в основном черное изображение, то есть мало изменений. Итак, на самом деле это три подшага: Сжать - Отправить - Разархивировать.
  3. Примените DIFF к настоящему изображению. Получатель может рассчитать следующее изображение IMG2 = DIFF + IMG1. Это может быть выполнено с использованием метода добавления Emgu CV.

Что касается моего подхода, я не уверен, что он будет полезен, я хотел бы, чтобы кто-то дал намек, что я подхожу в правильном направлении с этим.

Я считаю потоковую передачу с рабочего стола на мобильный телефон. Я бы использовал модель сервер-клиент с сетевыми сокетами TCP. Я считаю такой паттерн (протокол).

SERVER:

0)

ИЗОБРАЖЕНИЕ ЭКРАНА - представлено как unsigned char *rgba_arrayIMAGE_SIZE -> ширина, высота

1)

Отправить размер изображения ширину, высоту клиенту.

2)

init rgba_array с длиной <= ширина x высота x 4 байта (32-битные изображения) и весь массив обнулен.

0000 0000 0000 0000 0000 0000 0000 0000 (пример пикселя - 32 бита)

3)

если у меня есть новое изображение экрана (скриншот? или другим способом), я конвертирую его в unsigned char *new_rgba_array и чем сделать операцию XOR:

rgba_array XOR new_rgba_array => diff_rgba_array 

4)

чем я только отправляю клиенту это diff_rgba_array COMPRESSED? JPEG?

5) вернитесь к пункту 3) на стороне сервера.

КЛИЕНТ:

0)

получить ширину и высоту -> init rgba_array с длиной <= ширина * высота * 4 и обнуляет его

1)

получить diff_rgba_array что представляет изменения по сравнению с предыдущим изображением и ДЕКОМПРЕССИРУЕТ это? JPEG?

0011 1010 0110 0111 1110 0000 0100 0000 (пример разницы в пикселях)

0 - бит означает НЕТ ИЗМЕНЕНИЯ

1 - бит означает ИЗМЕНЕНИЕ к противоположному значению

2)

применить изменения, полученные от сервера в diff_rgba_array в rgba_array на стороне клиента. Я думаю, что я должен сделать следующий XORing. Как это

  10011101   10010101

  00001111   11111111 (XOR) 

= 10010010   01101010 

3)

вернуться к пункту 1) на стороне клиента

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

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

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

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

Ура!

Другие вопросы по тегам