//----------------------------------------------------------------------------
// Copyright (C) 2004-2013 by EMGU. All rights reserved.
//----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.VideoSurveillance;
using Emgu.Util;
namespace MotionDetection
{
public partial class Form1 : Form
{
private Capture _capture;
private MotionHistory _motionHistory;
private IBGFGDetector<Bgr> _forgroundDetector;
public Form1()
{
InitializeComponent();
//try to create the capture
if (_capture == null)
{
try
{
_capture = new Capture();
}
catch (NullReferenceException excpt)
{ //show errors if there is any
MessageBox.Show(excpt.Message);
}
}
if (_capture != null) //if camera capture has been successfully created
{
_motionHistory = new MotionHistory(
1.0, //in second, the duration of motion history you wants to keep
0.05, //in second, maxDelta for cvCalcMotionGradient
0.5); //in second, minDelta for cvCalcMotionGradient
_capture.ImageGrabbed += ProcessFrame;
_capture.Start();
}
}
private void ProcessFrame(object sender, EventArgs e)
{
using (Image<Bgr, Byte> image = _capture.RetrieveBgrFrame())
using (MemStorage storage = new MemStorage()) //create storage for motion components
{
if (_forgroundDetector == null)
{
//_forgroundDetector = new BGCodeBookModel<Bgr>();
_forgroundDetector = new FGDetector<Bgr>(Emgu.CV.CvEnum.FORGROUND_DETECTOR_TYPE.FGD);
//_forgroundDetector = new BGStatModel<Bgr>(image, Emgu.CV.CvEnum.BG_STAT_TYPE.FGD_STAT_MODEL);
}
_forgroundDetector.Update(image);
capturedImageBox.Image = image;
//update the motion history
_motionHistory.Update(_forgroundDetector.ForegroundMask);
forgroundImageBox.Image = _forgroundDetector.ForegroundMask;
#region get a copy of the motion mask and enhance its color
double[] minValues, maxValues;
Point[] minLoc, maxLoc;
_motionHistory.Mask.MinMax(out minValues, out maxValues, out minLoc, out maxLoc);
Image<Gray, Byte> motionMask = _motionHistory.Mask.Mul(255.0 / maxValues[0]);
#endregion
//create the motion image
Image<Bgr, Byte> motionImage = new Image<Bgr, byte>(motionMask.Size);
//display the motion pixels in blue (first channel)
motionImage[0] = motionMask;
//Threshold to define a motion area, reduce the value to detect smaller motion
double minArea = 100;
storage.Clear(); //clear the storage
Seq<MCvConnectedComp> motionComponents = _motionHistory.GetMotionComponents(storage);
//iterate through each of the motion component
foreach (MCvConnectedComp comp in motionComponents)
{
//reject the components that have small area;
if (comp.area < minArea) continue;
// find the angle and motion pixel count of the specific area
double angle, motionPixelCount;
_motionHistory.MotionInfo(comp.rect, out angle, out motionPixelCount);
//reject the area that contains too few motion
if (motionPixelCount < comp.area * 0.05) continue;
//Draw each individual motion in red
DrawMotion(motionImage, comp.rect, angle, new Bgr(Color.Red));
}
// find and draw the overall motion angle
double overallAngle, overallMotionPixelCount;
_motionHistory.MotionInfo(motionMask.ROI, out overallAngle, out overallMotionPixelCount);
DrawMotion(motionImage, motionMask.ROI, overallAngle, new Bgr(Color.Green));
//Display the amount of motions found on the current image
UpdateText(String.Format("Total Motions found: {0}; Motion Pixel count: {1}", motionComponents.Total, overallMotionPixelCount));
//Display the image of the motion
motionImageBox.Image = motionImage;
}
}
private void UpdateText(String text)
{
if (InvokeRequired && !IsDisposed)
{
Invoke((Action<String>)UpdateText, text);
}
else
{
label3.Text = text;
}
}
private static void DrawMotion(Image<Bgr, Byte> image, Rectangle motionRegion, double angle, Bgr color)
{
float circleRadius = (motionRegion.Width + motionRegion.Height) >> 2;
Point center = new Point(motionRegion.X + motionRegion.Width >> 1, motionRegion.Y + motionRegion.Height >> 1);
CircleF circle = new CircleF(
center,
circleRadius);
int xDirection = (int)(Math.Cos(angle * (Math.PI / 180.0)) * circleRadius);
int yDirection = (int)(Math.Sin(angle * (Math.PI / 180.0)) * circleRadius);
Point pointOnCircle = new Point(
center.X + xDirection,
center.Y - yDirection);
LineSegment2D line = new LineSegment2D(center, pointOnCircle);
image.Draw(circle, color, 1);
image.Draw(line, color, 2);
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
_capture.Stop();
}
}
}
我编译了emgu cv示例
他的名字是 MotionDetection
但是当我编译那个例子时,结果是错误,他给了我消息
&#39; Emgu.CV.CvInvoke&#39;的类型初始值设定项抛出异常。
我坚持这个_capture = new Capture();
我添加了对项目的引用 我已将opencv_core290.dll,opencv_highgui290.dll和opencv_imgproc290.dll复制到项目文件夹 但它仍然无法正常工作
消息仍然相同 &#39; Emgu.CV.CvInvoke&#39;的类型初始值设定项抛出异常。
我使用Visual Studio 2012 Ultimate和Win 8.1 有谁可以帮助我?
谢谢:)
答案 0 :(得分:0)
The type initializer for 'Emgu.CV.CvInvoke' threw an exception
表示您需要查看类的静态构造函数,或者查找该类的任何静态成员的初始化。最重要的是,我会看看你的异常被抛出的InnerException
属性。
我愿意打赌你有不正确或非法使用的静态方法或元素。
请在此处了解TypeInitializationException
:http://msdn.microsoft.com/en-us/library/system.typeinitializationexception(v=vs.110).aspx
答案 1 :(得分:0)
'Emgu.CV.CvInvoke'的类型初始值设定项引发了异常,这意味着EMGU.CV文件没有按代码检测。这是由于系统依赖性。您需要进入visual stdio中的configration manger窗口并选择所需的平台,然后根据您的平台复制相应的dll文件(64位dll文件forx64和32位dll for x86可以从emgu网站下载)。现在复制它没有像emgu.cv.invoke
这样的错误