EmguCV 类型初始化异常

Posted

技术标签:

【中文标题】EmguCV 类型初始化异常【英文标题】:EmguCV TypeInitializationException 【发布时间】:2012-07-07 08:29:56 【问题描述】:

我真的是 EgmuCV 的新手

我尝试使用以下代码从网络摄像头捕获图像:

//Program.cs (Winform)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Emgu.CV;
using Emgu.CV.UI;
using Emgu.Util;
using Emgu.CV.Structure;

namespace EgmuCVTest

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void button1_Click(object sender, EventArgs e)
        
            Capture cp = new Capture();
            ImageViewer imv = new ImageViewer();

            Application.Idle += new EventHandler(delegate(object s, EventArgs ea)
            
                imv.Image = cp.QueryFrame();
            );

            imv.ShowDialog();

        
    

我收到以下错误:

我检查并在 .exe 文件夹中有所有必需的 dll

【问题讨论】:

【参考方案1】:

在遇到同样的问题一段时间后,我发现解决此问题的说明 (TypeInitializer Exception) 不完整。

    对于基本应用程序,您需要在 .EXE 的目录中使用cvextern.dll, Emgu.CV.dll, Emgu.CV.UI.dll, Emgu.Util.dll

    您需要一个 x86(x64) 目录,位于 .exe 目录和“x86”目录中,您需要 opencv_calib3dXXX.dll, opencv_contribXXX.dll, opencv_coreXXX.dll, opencv_features2dXXX.dll, opencv_highguiXXX.dll, opencv_imgprocXXX.dll, opencv_legacyXXX.dll, opencv_mlXXX.dll, opencv_objectdetectXXX.dll, opencv_videoXXX.dllcudart32_42_9.dll, npp32_42_9.dll, opencv_flann240.dll

只要您包含所有必需的 DLL,该应用就会运行。

【讨论】:

对我来说,只要将 cvextern.dllC:\Emgu\emgucv-windows-universal 3.0.0.2157\bin\x86 复制到 ...\Visual Studio 2013\Projects\ScreenAnalyzer\TestProject\bin\Debug 就可以消除异常。 对我来说,通过 package-manager 在多项目解决方案中包含 Emgu,它是通过将引用 Emgu 的子项目的构建输出路径调整为输出路径(以及执行路径)来解决的StartUp 项目(在 VS 2017 中)。【参考方案2】:

我使用的是 Emgu 3.0 64 位,解决这个问题我唯一需要做的就是将项目中的构建类型更改为 x64。

右键单击您的项目名称 -> 属性 -> 构建 -> 平台目标 -> x64

参考http://www.codeproject.com/Articles/257502/Creating-Your-First-EMGU-Image-Processing-Project

希望对某人有所帮助。

【讨论】:

3 天的头撞墙解决了。在 VS 2013 Express 中,我刚刚单击了 Platform Target 中的“首选 32 位”,它突然开始工作了。很烦人的是“首选”选项会导致这样的问题。真的非常感谢。【参考方案3】:

发生在我身上的另一种情况是,我安装了一个 NuGet 包,但没有为我的项目加载,因此引用看起来不错,但在运行时,我得到了 TypeInitializationException。

-管理 NuGet 包

-对包进行时钟管理

-选中当前项目的复选框。

【讨论】:

【参考方案4】:

如果您使用的是使用 GPU 支持编译的 OpenCV DLL,但您的 PC 没有 GPU,也会出现此问题,例如如果您使用的是带有 Intel 图形芯片组的便携式计算机。

在这种情况下,您可以使用旧版本 2.4.0,它仍然提供不支持 GPU 的 DLL:

https://sourceforge.net/projects/emgucv/files/emgucv/2.4.0/libemgucv-windows-x64-2.4.0.1717.zip

【讨论】:

您好,请您描述一下如何使用 emgucv 2.4.. 我在您推荐的软件包中找不到 dll 吗?谢谢! DLL 位于文件夹bin/bin/x64/ 中的链接ZIP 文件中,分别对应32 位和64 位。最简单的是,将它们全部链接到您的项目,您将能够访问最初问题中提到的对象 CaptureImageViewer【参考方案5】:

如果您使用的是 64 位操作系统,只需从 x64 文件夹中复制 cvextern.dll 文件,然后将其复制到项目的 debug 文件夹中。

注意:手动进行,因为“添加现有项目” 不会复制它。

【讨论】:

以上是关于EmguCV 类型初始化异常的主要内容,如果未能解决你的问题,请参考以下文章

Emgu.CV.CvInvoke的类型初始值设定项引发异常

EmguCV 中的等价物

类型初始化异常

类型初始值设定项引发异常。C# web

类型初始值设定项引发异常

Emgu.CV.CvInvoke”的类型初始值设定项引发异常。