作为一个玩具项目,我想编写一个应用程序,它将从网络摄像头拍摄照片,然后检测它们的变化。我想检测是否有人走在网络摄像头前。
你们能告诉我一些如何在两次连续拍摄中发现重大变化的指示吗?
答案 0 :(得分:11)
将每像素亮度值从一个图像减去另一个图像。
这将为您提供移动内容的每个像素的高值,以及相同位置的低值。总计这些值并检查它是否高于某个阈值数,以查看是否发生了重大变化。
我从笔记本电脑上拍了一张手的照片来显示:
答案 1 :(得分: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!' );
(这只是伪代码,因为代码处理速度相当慢,如果你想快速处理图像中的所有像素,请谷歌搜索“scanline”)
您可能需要根据经验定义阈值:通过相机缓慢行走,最好穿着与背景颜色相匹配的衣服,并查看您获得的三角形。
跳帧应该会提高灵敏度。
答案 2 :(得分:1)
在Code Project处翻译是一篇很好的文章,解释了可能的解决方案。