在C#中使用Emgu.CV的System.TypeInitializationException

此时我有一个function,需要从我的相机界面调用图像。 然后,此映像将保存到硬盘驱动器,并显示在Windows窗体GUI中。

返回图像的摄像机界面内的function如下:高度和宽度都是整数,它们是摄像机接口类的一部分。 在这种情况下,它们被设置为800×600。

public Image QueryFrame() { Image temp; lock (key) { using (Capture cap = new Capture()) { cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, height); cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, width); temp = cap.QueryFrame().Copy(); } } return temp; } 

多次调用该函数首先显示捕获帧需要相当长的时间,将程序锁定不使用几秒钟。 然后,在使用Visual C#2010在Debug中运行程序时捕获几帧后,弹出了vshost.exe的Windows错误:

 Faulting application DashboardGUI.vshost.exe, version 10.0.30319.1, time stamp 0x4ba2084b, faulting module MSVCR90.dll, version 9.0.30729.6161, time stamp 0x4dace5b9, exception code 0xc0000005, fault offset 0x00024682, process id 0xe78, application start time 0x01cc792086025f01. 

然后我继续发布应用程序并从可执行文件运行它并得到错误:

 Application: DashboardGUI.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.TypeInitializationException Stack: at Emgu.CV.CvInvoke.cvReleaseCapture(IntPtr ByRef) at Emgu.CV.Capture.DisposeObject() at Emgu.Util.DisposableObject.Finalize() 

但是我也让它与Emgu.CV.CvInvoke.cvCreateCameraCapture(Int32)抛出相同的exception。

是什么导致了这些问题? 他们怎么能避免? 是否有任何方法可以比当前更快地捕获帧(当它没有崩溃时)?

我看了你的代码,我看到了问题。 我之所以崩溃的原因是由于我建议的使用声明抱歉:s。 那不完全是使用声明。 您似乎经常访问代码以供系统处理。

 Capture cap = new Capture() 

对少量代码进行大量操作。 它不仅设置与您的相机的通信,但检查它是否存在,处理驱动程序并创建环形缓冲区等。现在,虽然给出的代码确保只返回更新的图像,但通常只有使用按钮或计时器时才能正常工作一段时间的延迟。 现在我知道你想要实现什么,并且因为你想要的图像比使用这种方法可以合理地实现的图像更频繁,你有一个更实用的选择。

全局设置Capture设备并将其设置为记录并调用ProcessFrame以便尽可能从缓冲区获取图像。 现在更改您的QueryFrame只是为了复制它刚刚获得的任何帧。 这将有望阻止您获取前一帧的问题,现在您将拥有缓冲区中的最新帧。

 private Capture cap; Image frame; public CameraCapture() { InitializeComponent(); cap= new Capture(); cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, height); cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, width); Application.Idle += ProcessFrame; } private void ProcessFrame(object sender, EventArgs arg) { frame = _capture.QueryFrame(); grayFrame = frame.Convert(); } public Image QueryFrame() { return frame.Copy(); } 

希望这次有助于您找到解决方案,对不起,其他方法没用,

干杯克里斯

http://www.emgu.com/wiki/index.php/Setting_up_EMGU_C_Sharp – 当我遇到同样的问题时,这真的很有帮助,可能值得一看。