2012-11-05 13 views
2

我需要找到哪些矩形区域在两幅图像之间更新。例如,我有这些图片:在图像中查找更新的矩形

first http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/1.pngsecond http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/2.png

ImageMagick的compare告诉我,这个像素进行了更新:

compare http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/3.png

所以我需要重新绘制这个地区(已概述他们的第一个):

compare http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/4.png

通过慢速连接(57600波特)完成重绘,所以第一优先级是数据大小(魔术字一个字节,校验和一个字节,区域坐标六个字节,每个像素两个字节)。我可以使用哪种算法来查找这些区域?我认为,类似的东西在vnc和类似的软件中使用。

回答

4

就像ImageMagick为您所做的那样,实际找到已更改的区域,您可以计算逐个像素的差异(例如XOR)。差异为0的区域没有改变。

从您的问题中不清楚绘画本身是否缓慢或只是传输重新绘制数据。目前还不清楚在传输的另一端可以完成哪种编码/解码。您是否必须按照您的指定发送您的数据,或者您是否可以按照其他方式对其进行编码?

您的数据包每个矩形的开销为8个字节“(一个字节表示魔法字,一个字节表示校验和,六个字节表示区域坐标,两个字节表示每个像素)”。我从颜色深度为16位的每个像素的两个字节中获取它?所以,由于开销,所列出的一些最小的矩形实际上比将其与其他矩形组合在一起并重新发送非更新区域上的一些数据花费更多。

找到矩形的实际问题,其中每个都有一个开销类似于ITA软件提出的“草莓领域”招聘问题。原始链接已死亡,但是here is someone's solution with problem description.

在57600波特率时,您将发送每秒7200个字节,这将是每像素两个字节的3600个像素。作为一个正方形,这是一个可怜的60x60。在你的例子中,你肯定已经概述了更多的内容,而这并不包括开销。

接收端显示器的刷新率也需要考虑。如果显示器每秒刷新60次,并且每秒只能发送一个60x60平方,这将如何显示?

需要考虑的事情:

  • 减少颜色深度每条扫描线
  • 运行长度编码像素差异
  • 尝试每个区域更加雄心勃勃的压缩,但是要注意的开销
  • 发送非图形数据并让接收器计算图形(例如,在本例中,发送已更改的文本,更新的时间等,并让接收器绘制进度条等。)
  • 放弃这个疯狂
+0

涂装设备是STM32F103 MCU与软件FSMC连接LCD,所以一切都没有那么快。 RLE的想法非常好:这将改善传输速度和喷绘速度。感谢您的链接,这正是我需要的! – vas3k

+0

我不知道这是什么意思,但我很高兴我可以帮助!因为它似乎适用于您,将关于“草莓场”的链接移到了答案的正文中。 –