如何使用视频和声音信息检测入侵者
本文介绍了如何使用视频和声音信息检测入侵者。

引言
本文展示了如何使用视频和声音信息来检测入侵者。图像数据和声音数据分别通过摄像头和麦克风从环境中持续收集。一旦周围环境的条件发生变化,相应的警报将立即发出。
该软件包包含
DirectShowLib
: 操作摄像头,抓取图像。我已经将与IntruderDetection
相关的函数包装在CManipulateWebcam
类中。有关 DirectShowLib 的更多信息,请参见 directshow.net。ManipulateMicrophone
: 操作麦克风,抓取声音,播放声音。与IntruderDetection
相关的函数包装在CManipulateMicrophone
类中。有关ManipulateMicrophone
的更多信息,请参见文章 "使用代码" 部分: 通过网络发送和播放麦克风音频。WavStream
: 读取 .wav 文件,将数据保存到 .wav 文件。CManipulateMicrophone
类使用 WavStream.dll 将声音数据保存到 .wav 文件。以下代码很有用WaveStreamWriter wavwrite = WaveStreamWriter (FileName, SamplingRate, Channels, BitPerSample); // SoundBuffer is an array which contains the sound data you want to save wavwrite.Write(SoundBuffer, BufferLength);
IntruderDetection
:主应用程序需要 (DirectShowLib.dll, ManipuateMicrophone.dll, WavStream.dll)。DirectShowLib
、ManipulateMicrophone
和WavStream
是独立的项目。您可以在您的应用程序中使用DirectShowLib
与摄像头交互。使用ManipulateMicrophone
与麦克风交互。使用WavStream
与 .wav 文件交互。当然,使用IntruderDetection
来检测入侵者。
IntruderDetection 如何工作
- 视频检测:选中“视频检测”框以打开视频检测。如果选中“视频报警”框,将激活警报。一旦出现异常情况,异常信息(0-3 秒)将自动记录在文件夹中:IntruderDetection>>bin>>Debug>>image>>(yyyy-MM-dd-H), filename (mm-ss-ff).jpg
- 声音检测:选中“声音检测”框以打开声音检测。如果选中“声音报警”框,将激活警报。选中“声音回声”框以播放来自麦克风的声音。同样,异常信息(0-3 秒)将自动记录在文件夹中
IntruderDetection>>bin>>Debug>>sound>>(yyyy-MM-dd-H), filename (mm-ss-ff).wav
IntruderDetection 的背景知识
视频检测
对于视频,定义两个图像 a(i,j) (ra,ga,ba) 和 b(i,j)(rb,gb,bb) 之间的距离为
D1=∑((|ra-rb|+|ga-gb|+|ba-bb|)/3) i=1,2...; j=1,2,... 或
D2=∑((|ra-rb|2+|ga-gb|2+|ba-bb|2)/3) i=1,2...; j=1,2,... 或
D3=max((|ra-rb|+|ga-gb|+|ba-bb|)/3) i=1,2...; j=1,2,...
如果 D1,D2 或 D3 大于阈值,我们认为有事情发生。例如
private bool CompareImage(Bitmap a, Bitmap b)
{
int width = b.Width;
int height = b.Height;
BitmapData data_a = a.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData data_b = b.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* pa = (byte*)data_a.Scan0;
byte* pb = (byte*)data_b.Scan0;
int offset = data_b.Stride - width * 3;
double Ra, Ga, Ba, Rb, Gb, Bb;
double temp1 = 0, temp2 = 0;
double max = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
Ra = (double)pa[2];
Ga = (double)pa[1];
Ba = (double)pa[0];
Rb = (double)pb[2];
Gb = (double)pb[1];
Bb = (double)pb[0];
temp1 = (Math.Abs(Ra - Rb) + Math.Abs(Ga - Gb) + Math.Abs(Ba - Bb)) / 3;
temp2 += temp1;
if (temp1 > max)
{
max = temp1;
}
pa += 3;
pb += 3;
}
pa += offset;
pb += offset;
}
temp2 = temp2 / (height * width);
a.UnlockBits(data_a);
b.UnlockBits(data_b);
if (max > 200 || temp2 > 5)
{
return true;
}
else
{
return false;
}
}
}
在默认情况下,指针在 C# 中是不允许的。您需要打开 IntruderDetection
的属性,点击生成,选中“允许不安全代码”框。您可以调整阈值以适应您的机器。
声音检测
每 25 毫秒计算一次声能。如果能量大于阈值,则发生某些事情。
结论
本文展示了如何使用视频和声音信息来检测入侵者(深入研究 IntruderDetection
)。在此过程中,使用了一些有用的中间技术,包括如何操作摄像头(深入研究 DirectShowLib
)、如何操作麦克风(深入研究 ManipulateMicrophone
)、如何与 .wav 文件交互(深入研究 WavStream
)。玩得开心!
历史
- 2011 年 9 月 14 日:文章的初始版本