4

您好我正在编写一个客户端/服务器远程查看器(桌面共享)应用程序,其中桌面的屏幕截图通过套接字通过网络发送。我想通过获取两个图像之间的差异然后发送差异来减少传输的大小。另一方面,差异将与另一端的先前图像合并。

所以请任何人指导我如何完成这项工作。现在我仍然每次通过网络以编程方式发送屏幕的完整图像,而另一端的程序只显示该图像。我觉得巨大的数据正在通过网络传递,另一端的屏幕更新速度很慢。所以请告诉我如何比较两个图像并仅将差异发送到另一端的好方法。还告诉我如何将差异与另一端的实际图像合并。

1) 有很多免费代码和库可用于图像比较,但我只是不明白我应该使用哪一个,哪一个会更快进行比较。所以请指导我。

2)最重要的部分是如何仅通过网络发送差异并将差异与另一端的实际图像合并

我尝试了很多关于我的第 2 点的信息,但没有得到类似的信息。没有文章我发现谁能指导我如何仅通过网络发送差异并将差异与另一端的实际图像合并

所以我正在寻找针对我的第 2 点的深入讨论。谢谢

4

3 回答 3

5

You will have to follow three steps:

  1. Create a difference (DIFF) of the two consecutive images. Comparing the two images pixel per pixel will be very time consuming. You should utilize a well-established library like OpenCV; check out the Emgu CV library (http://www.emgu.com/) for .NET: AbsDiff() should be the method you're looking for. The result will be something like DIFF = IMG2 - IMG1.
  2. Send the DIFF through the network. It's still a full image, but JPEG or PNG will utilize its full compression capability assuming it is a mainly black image, i.e. few changes. So these are actually three substeps: Compress - Send - Decompress.
  3. Apply the DIFF on the present image. The recipient can calculate the next image IMG2 = DIFF + IMG1. This can be performed using EmguCV's Add method.
于 2012-11-30T10:32:32.917 回答
1

I know am very late responding but I found this question today

I have done some analysis on Image Differencing but the code was written for java. Kindly look into the below link that may come to help

How to find rectangle of difference between two images

The code finds differences and keeps the rectangles in a Linkedlist. You can use the linkedlist that contains the Rectangles to patch the differences on to the Base Image.

Cheers !

于 2013-11-21T09:34:45.277 回答
1

我的方法怎么样,我不确定它是否有用,我希望有人能暗示我正在朝着正确的方向前进。

我考虑将桌面流式传输到手机。我会使用带有网络 TCP 套接字的服务器-客户端模型。我考虑这样的模式(协议)。

服务器:

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压缩?JPEG?

5)回到服务器端的第3点)。

客户:

0)

获取宽度和高度- > init rgba_arraywith length <= width * height * 4 并将其归零

1)

得到diff_rgba_array表示与以前图像相比的变化并解压它?JPEG?

0011 1010 0110 0111 1110 0000 0100 0000(示例像素差异)

0 - 位表示没有变化

1 - 位表示更改为相反值

2)

将从服务器收到的更改应用diff_rgba_arrayrgba_array 客户端。我想我应该做下一个XORing。像这样

  10011101   10010101

  00001111   11111111 (XOR) 

= 10010010   01101010 

3)

返回到客户端的第 1 点)

于 2016-09-25T19:09:26.570 回答