找到屏幕共享应用程序的两个图像之间的差异

时间:2012-11-30 09:34:10

标签: c# image-comparison screensharing desktop-sharing

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

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

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

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

我尝试了很多关于我的观点2的一些信息,但没有任何相似之处。没有文章我发现谁可以指导我如何仅通过网络发送差异并将差异与另一端的实际图像合并

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

3 个答案:

答案 0 :(得分:4)

您必须遵循以下三个步骤:

  1. 创建两个连续图像的差异(DIFF)。比较两个图像每像素的像素将非常耗时。您应该使用像OpenCV这样完善的图书馆;查看用于.NET的Emgu CV库(http://www.emgu.com/):AbsDiff()应该是您正在寻找的方法。结果将类似于DIFF = IMG2 - IMG1。
  2. 通过网络发送DIFF。它仍然是一个完整的图像,但JPEG或PNG将利用其完全压缩功能,假设它是一个主要的黑色图像,即几乎没有变化。所以这些实际上是三个子步骤:压缩 - 发送 - 解压缩
  3. 在当前图片上应用DIFF 。收件人可以计算下一个图像IMG2 = DIFF + IMG1。这可以使用EmguCV的Add方法执行。

答案 1 :(得分:0)

我知道我迟到了,但我今天发现了这个问题

我已对图像差异进行了一些分析,但代码是为 java 编写的。请查看以下可能提供帮助的链接

How to find rectangle of difference between two images

代码找到差异并将矩形保留在Linkedlist中。您可以使用包含矩形的链接列表来修补基本图像上的差异。

干杯!

答案 2 :(得分:0)

我的方法怎么样,我不确定它会有用,我希望有人给出一些暗示,我正朝着正确的方向前进。

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

服务器:

0)

屏幕图像 - 表示为unsigned char *rgba_array IMAGE_SIZE - >宽度,高度

1)

将图片尺寸宽度,高度发送给客户。

2)

init rgba_array ,长度< =宽x高x 4字节(32位图像),所有数组都归零。

<00> 0000 0000 0000 0000 0000 0000 0000 0000(示例像素 - 32位)

3)

如果我有屏幕的新图片(屏幕截图?或其他方式),我会将其转换为unsigned char *new_rgba_array而不是进行 XOR 操作:< / p>

rgba_array XOR new_rgba_array => diff_rgba_array 

4)

比我只向客户端发送此diff_rgba_array COMPRESSED? JPEG?

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

<强>客户端:

0)

获取宽度和高度 - &gt;初始化rgba_array,长度为&lt; = width * height * 4并将其归零

1)

得到diff_rgba_array代表与之前图片和DECOMPRESS相比的变化吗? JPEG?

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

0 - 位表示 NO CHANGE

1位表示 CHANGE 为反对值

2)

将从diff_rgba_array中的服务器收到的更改应用于客户端的rgba_array 。我想我应该做下一个 XORing 。喜欢这个

  10011101   10010101

  00001111   11111111 (XOR) 

= 10010010   01101010 

3)

回到客户端的第1点