Найдите различия между двумя изображениями для приложений для обмена экранами
Привет, я пишу клиент / сервер удаленного просмотра приложения (общий доступ к рабочему столу), где скриншоты рабочего стола отправляются через сеть через сокет. Я хотел бы уменьшить размер перевода, получив разницу между двумя изображениями, а затем отправив разницу. с другой стороны, разница будет объединена с предыдущим изображением на другом конце.
так что кто-нибудь, пожалуйста, направьте меня, как я могу выполнить эту работу. до сих пор я посылаю каждый раз полное изображение экрана по сети программно, а программа на другом конце просто показывает это изображение. я чувствую, что огромные данные проходят через сеть, а скорость обновления экрана на другом конце медленная. поэтому, пожалуйста, покажи мне хороший способ сравнить два изображения и отправить только разницу на другом конце. Также скажите мне, как объединить разницу с реальным изображением на другом конце.
1) доступно много свободного кода и библиотеки для сравнения изображений, но я просто не понимаю, какой из них использовать, а какой - для сравнения. так что просто направь меня по этому поводу.
2) и самая важная часть - как отправить разницу только по сети и объединить разницу с реальным изображением на другом конце
Я много пытался получить информацию о моей точке 2, но ничего подобного не получил. я не нашел ни одной статьи, которая могла бы подсказать мне, как отправить разницу только по сети и объединить разницу с реальным изображением на другом конце
поэтому я ищу подробное обсуждение моего пункта 2 специально. Спасибо
3 ответа
Вам нужно будет выполнить три шага:
- Создайте разницу (DIFF) двух последовательных изображений. Сравнение двух пикселей на пиксель будет очень трудоемким. Вы должны использовать хорошо зарекомендовавшую себя библиотеку, такую как OpenCV; проверьте библиотеку CV Emgu (http://www.emgu.com/) для.NET: AbsDiff () должен быть методом, который вы ищете. Результатом будет что-то вроде DIFF = IMG2 - IMG1.
- Отправьте DIFF через сеть. Это все еще полное изображение, но JPEG или PNG будут использовать все возможности сжатия, предполагая, что это в основном черное изображение, то есть мало изменений. Итак, на самом деле это три подшага: Сжать - Отправить - Разархивировать.
- Примените DIFF к настоящему изображению. Получатель может рассчитать следующее изображение IMG2 = DIFF + IMG1. Это может быть выполнено с использованием метода добавления Emgu CV.
Что касается моего подхода, я не уверен, что он будет полезен, я хотел бы, чтобы кто-то дал намек, что я подхожу в правильном направлении с этим.
Я считаю потоковую передачу с рабочего стола на мобильный телефон. Я бы использовал модель сервер-клиент с сетевыми сокетами TCP. Я считаю такой паттерн (протокол).
SERVER:
0)
ИЗОБРАЖЕНИЕ ЭКРАНА - представлено как unsigned char *rgba_array
IMAGE_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. Пожалуйста, посмотрите на ссылку ниже, которая может прийти на помощь
Как найти прямоугольник разницы между двумя изображениями
Код находит различия и сохраняет прямоугольники в списке ссылок. Вы можете использовать связанный список, содержащий прямоугольники, чтобы исправить различия в базовом изображении.
Ура!