65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.05/5 (55投票s)

2004年5月26日

CPOL

3分钟阅读

viewsIcon

582952

downloadIcon

45905

使用C#通过网络摄像头进行运动检测。

Sample Image - md01.jpg

引言

本文试图阐明如何使用C#通过网络摄像头进行运动检测。我的朋友Walied想用网络摄像头在办公室里连续24小时录像,但问题是硬盘上的空间需求非常大。因此,他让我找一种节省磁盘空间的方法。Walied建议做一个运动检测电路(红外、超声波),并将其连接到PC的串口,并每隔一段时间检查是否有输入。如果有任何输入,则运行录制程序并开始录制视频。但我回复说,这不是一个好办法,因为小偷会在缓慢的计算机请求网络摄像头开始录制视频之前逃脱。

所以我的想法是每隔一段时间从网络摄像头拍摄一张照片(将其作为当前照片),并将其与之前的照片进行比较,如果发现它们之间有很大的差异,我们将保存这两张照片;否则,我们将从旧照片中释放内存,并将新照片作为当前照片。

但有两个大问题

  1. 如何与您的网络摄像头通信并从中获取一帧(照片)?
  2. 我该如何比较这两张照片?

解决方案

  1. 有两种方法可以与网络摄像头通信
    1. 使用DirectX的名为DirectShow的组件(但不幸的是,DirectX没有为C#提供DirectShow组件。NETMaster在他的文章DirectShow.NET中制作了一个程序集来解决这个问题)。Elgitaro:检查一下这个。
    2. 使用第三方摄像头服务器(您可以在Laurent Kempé的文章动态网络摄像头图像中找到它)。
  2. 也有两种方法可以比较两张照片
    1. 通过比较两张照片中每个像素的颜色。
    2. 使用滤镜来检测边缘,然后进行对象识别...

    我认为方法(a)会更快,因为我们讨论的是3毫秒的时间间隔。

试试

这是我的算法

algorithm-Drawing1.jpg

首先,从一个名为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

您的表单看起来像这样

motion_detection_wc/catchit.jpg

Catch

由于 IO 操作的时间,此程序无法像我需要的那么快地工作。 所以我使用另一种技术来使其快速,通过在面板上捕获视频,然后从中抓取图像。 这使得应用程序像我需要的那样快速工作。 这个应用程序叫做 CatchItV,第一个叫做 CatchIt(请尝试这两个并给我发送您的评论)。

© . All rights reserved.