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

如何使用视频和声音信息检测入侵者

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (18投票s)

2011年9月16日

CPOL

2分钟阅读

viewsIcon

51517

downloadIcon

4265

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

intruderdetection2.png

intruderdetection1.png

引言

本文展示了如何使用视频和声音信息来检测入侵者。图像数据和声音数据分别通过摄像头和麦克风从环境中持续收集。一旦周围环境的条件发生变化,相应的警报将立即发出。

该软件包包含

  • 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)。
  • DirectShowLibManipulateMicrophoneWavStream 是独立的项目。您可以在您的应用程序中使用 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 日:文章的初始版本
© . All rights reserved.