检测连续两张图片中的变化

4
作为一个玩具项目,我想编写一个应用程序,可以从网络摄像头中获取照片,然后检测它们的变化。我想要检测是否有人走到了网络摄像头前面。
你们能否给我一些指针,告诉我如何检测两个连续快照之间的重大变化?
3个回答

12

从一个图像中减去每个像素的亮度值并将其与另一个图像进行比较。

这将使您在移动某些东西的情况下获得每个像素的高值,而在相同的地方获得低值。总结这些值并检查它们是否高于特定的阈值,以查看是否发生了重大变化。

我拍了一张我的手的照片从我的笔记本电脑来展示这个原理:

alt text


1
在自然光下,这种方法会产生误报,因为太阳在天空中移动,光线水平和阴影也在变化。 - Paul Tomblin
@Paul,我认为这不会是一个大问题,因为太阳不会突然移动,而且应该跟踪的是显著的光强变化。 - idursun
1
如果太阳突然移动,我们会有更重要的事情要做。O_O - Vladimir Dyuzhev
这基本上是低级滤波器的标准:减法和阈值处理。许多机器视觉系统完全建立在这个简单的滤波器之上(有时候,只会使用更复杂的滤波器)。当然,可靠的阈值处理依赖于一致的光照条件 ;) - James B

2

我建议先将图像缩小到30K至60K像素左右。这不仅可以加快计算速度,还可以消除微小的无关变化。例如,你不想检测到被风吹动的窗户旁边的窗帘。

接下来,对像素值的平方差进行求和。如果你想彻底做到这一点,可以分别对R、G和B进行操作:

Delta := 0;
for y := 0 to Im1.Height do begin
  for x := 0 to Im1.Width do begin
    DeltaR := ( Im1[x,y].Red   - Im2[x,y].Red ) ^ 2;
    DeltaG := ( Im1[x,y].Green - Im2[x,y].Green ) ^ 2;
    DeltaB := ( Im1[x,y].Blue  - Im2[x,y].Blue ) ^ 2;
    Delta := Delta + DeltaR + DeltaG + DeltaB;
  end;
end;

if (Delta > Treshold) then
  Say( 'Hi Bob!' );

(这只是伪代码,如果要快速处理图像中的所有像素,请搜索“扫描线”)

您可能希望根据经验定义阈值:缓慢地通过相机,最好穿着与背景颜色相匹配的衣服,并查看您得到的差异。
跳过帧应该增加灵敏度。


1

Code Project 上有一篇不错的文章,解释了一个可能的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接