使用网络摄像头进行运动检测






4.05/5 (55投票s)
使用C#通过网络摄像头进行运动检测。
引言
本文试图阐明如何使用C#通过网络摄像头进行运动检测。我的朋友Walied想用网络摄像头在办公室里连续24小时录像,但问题是硬盘上的空间需求非常大。因此,他让我找一种节省磁盘空间的方法。Walied建议做一个运动检测电路(红外、超声波),并将其连接到PC的串口,并每隔一段时间检查是否有输入。如果有任何输入,则运行录制程序并开始录制视频。但我回复说,这不是一个好办法,因为小偷会在缓慢的计算机请求网络摄像头开始录制视频之前逃脱。
所以我的想法是每隔一段时间从网络摄像头拍摄一张照片(将其作为当前照片),并将其与之前的照片进行比较,如果发现它们之间有很大的差异,我们将保存这两张照片;否则,我们将从旧照片中释放内存,并将新照片作为当前照片。
但有两个大问题
- 如何与您的网络摄像头通信并从中获取一帧(照片)?
- 我该如何比较这两张照片?
解决方案
- 有两种方法可以与网络摄像头通信
- 使用DirectX的名为DirectShow的组件(但不幸的是,DirectX没有为C#提供DirectShow组件。NETMaster在他的文章DirectShow.NET中制作了一个程序集来解决这个问题)。Elgitaro:检查一下这个。
- 使用第三方摄像头服务器(您可以在Laurent Kempé的文章动态网络摄像头图像中找到它)。
- 也有两种方法可以比较两张照片
- 通过比较两张照片中每个像素的颜色。
- 使用滤镜来检测边缘,然后进行对象识别...
我认为方法(a)会更快,因为我们讨论的是3毫秒的时间间隔。
试试
这是我的算法
首先,从一个名为Old
的网络摄像头抓取图像。第二,过一段时间后从网络摄像头抓取另一张图片,称为Cur
。 通过比较每个像素的颜色来比较Cur
& Old
。 如果差异大于测试值(根据您使用的网络摄像头和灯光系统的质量,在 60 或 50 Hz 时),则保存这两张图片。 最后,使旧图片成为Cur
图片。 返回到第二步(无限循环)。
让我们编写一些代码
- 获取camserver.dll & ijl15.dll(将这两个文件复制到c:\windows\system32,然后在开始->运行中输入regsvr32 camserver.dll以注册COM组件)。
- 创建一个新的Windows项目,在您的窗体中粘贴三个
PictureBox
,粘贴两个Button
,最后粘贴一个Timer
控件并将其enabled
属性设置为false
。
您的表单看起来像这样
Catch
由于 IO 操作的时间,此程序无法像我需要的那么快地工作。 所以我使用另一种技术来使其快速,通过在面板上捕获视频,然后从中抓取图像。 这使得应用程序像我需要的那样快速工作。 这个应用程序叫做 CatchItV,第一个叫做 CatchIt(请尝试这两个并给我发送您的评论)。