我真的无法理解这一点,所以我希望有人可以帮我一点^^
我正试图通过我的网络摄像头检测C#中的运动。
到目前为止,我已尝试过多个库(AForge Lib),但失败了,因为我不明白如何使用它。
起初我只是想比较当前帧和最后一帧的像素,但结果却像是完全一样:I
现在,我的网络摄像头每次从网络摄像头运行一个事件“webcam_ImageCaptured”,就像5-10 fps。
但我无法找到一种简单方式来区分这两个图像,或者至少是一些有效的方法。
有没有人知道我怎么能这么简单(尽可能这样)?
答案 0 :(得分:11)
使用您提到的库进行运动检测非常简单。以下是AForge(2.2.4版)示例。它适用于视频文件,但您可以轻松地将其调整为网络摄像头事件。
约翰内斯是对的,但我认为玩这些库可以简化理解基本图像处理的方法。
我的应用程序在一台装有SSD的非常快的机器上以120FPS处理720p视频,在我的开发笔记本电脑上处理大约50FPS。
public static void Main()
{
float motionLevel = 0F;
System.Drawing.Bitmap bitmap = null;
AForge.Video.FFMPEG.VideoFileReader reader = null;
AForge.Vision.Motion.MotionDetector motionDetector = null;
motionDetector = GetDefaultMotionDetector();
reader.Open(@"C:\Temp.wmv");
while (true)
{
bitmap = reader.ReadVideoFrame();
if (bitmap == null) break;
// motionLevel will indicate the amount of motion as a percentage.
motionLevel = motionDetector.ProcessFrame(bitmap);
// You can also access the detected motion blobs as follows:
// ((AForge.Vision.Motion.BlobCountingObjectsProcessing) motionDetector.Processor).ObjectRectangles [i]...
}
reader.Close();
}
// Play around with this function to tweak results.
public static AForge.Vision.Motion.MotionDetector GetDefaultMotionDetector ()
{
AForge.Vision.Motion.IMotionDetector detector = null;
AForge.Vision.Motion.IMotionProcessing processor = null;
AForge.Vision.Motion.MotionDetector motionDetector = null;
//detector = new AForge.Vision.Motion.TwoFramesDifferenceDetector()
//{
// DifferenceThreshold = 15,
// SuppressNoise = true
//};
//detector = new AForge.Vision.Motion.CustomFrameDifferenceDetector()
//{
// DifferenceThreshold = 15,
// KeepObjectsEdges = true,
// SuppressNoise = true
//};
detector = new AForge.Vision.Motion.SimpleBackgroundModelingDetector()
{
DifferenceThreshold = 10,
FramesPerBackgroundUpdate = 10,
KeepObjectsEdges = true,
MillisecondsPerBackgroundUpdate = 0,
SuppressNoise = true
};
//processor = new AForge.Vision.Motion.GridMotionAreaProcessing()
//{
// HighlightColor = System.Drawing.Color.Red,
// HighlightMotionGrid = true,
// GridWidth = 100,
// GridHeight = 100,
// MotionAmountToHighlight = 100F
//};
processor = new AForge.Vision.Motion.BlobCountingObjectsProcessing()
{
HighlightColor = System.Drawing.Color.Red,
HighlightMotionRegions = true,
MinObjectsHeight = 10,
MinObjectsWidth = 10
};
motionDetector = new AForge.Vision.Motion.MotionDetector(detector, processor);
return (motionDetector);
}
答案 1 :(得分:1)
运动检测是一个复杂的问题,它需要大量的计算能力。
尝试限制首先要检测的内容。随着复杂性的增加:您是否想要检测是否有运动?你想检测多少运动?您想检测图像的哪些区域实际移动吗?
我假设您只是想知道什么时候发生了变化: