作为一个玩具项目,我想编写一个应用程序,可以从网络摄像头中获取照片,然后检测它们的变化。我想要检测是否有人走到了网络摄像头前面。
你们能否给我一些指针,告诉我如何检测两个连续快照之间的重大变化?
你们能否给我一些指针,告诉我如何检测两个连续快照之间的重大变化?
从一个图像中减去每个像素的亮度值并将其与另一个图像进行比较。
这将使您在移动某些东西的情况下获得每个像素的高值,而在相同的地方获得低值。总结这些值并检查它们是否高于特定的阈值,以查看是否发生了重大变化。
我拍了一张我的手的照片从我的笔记本电脑来展示这个原理:
我建议先将图像缩小到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!' );
(这只是伪代码,如果要快速处理图像中的所有像素,请搜索“扫描线”)
您可能希望根据经验定义阈值:缓慢地通过相机,最好穿着与背景颜色相匹配的衣服,并查看您得到的差异。
跳过帧应该增加灵敏度。