"Emgu.CV.CvInvoke"的类型初始化程序引发了异常。

19

我遇到了这个错误:

类型初始化程序“Emgu.CV.CvInvoke”的异常。

当我尝试使用Emgu CV时。我已经尝试了我能想到的所有方法来修复它,但它仍然会显示相同的错误。当我单击按钮时,它显示:

对象引用未设置为对象实例。

以下是我尝试的代码:

void ProcessFunction(object sender, EventArgs e)
{
    imgOrg = capturecam.QueryFrame();
    if (imgOrg == null) return;
    imgProc = imgOrg.InRange(new Bgr(50, 50, 50), new Bgr(255, 255, 255));
    imgProc = imgProc.SmoothGaussian(9);
    imageBox1.Image = imgOrg;
    imageBox2.Image = imgProc;
}

我可能做错了什么,如何进一步调试?谢谢!


我知道这是一个老问题,但如果你的操作系统是64位,则应该使用EmguCV x64 dlls,如果操作系统是32位,则使用EmguCV x86 dlls。重要的不是如何构建你的解决方案,可以轻松地构建为“任何CPU”。 - Mr. Blond
下载Emgu.cv的NuGet和Windows运行时:http://www.emgu.com/wiki/index.php/Download_And_Installation - RadioSpace
13个回答

16

我遇到了同样的问题,我的内部异常是"无法加载 DLL 'opencv_core290'"。

你需要从"yourEmguFolder/bin"目录中复制x86和x64文件夹到你的项目输出(bin)目录中。然后重新构建项目并运行。

根据 emgu wiki 的说法。


1
伙计们,这是我在尝试了几个小时后唯一有效的方法!谢谢Muhammed。 - Elie M

10

可能是未能加载非托管的 DLL 依赖项导致的问题。以下是一些建议:

  1. 确保您的 .NET 项目目标是 x86 而非 AnyCPU,因为您可能有 x86 版本的 OpenCV 构建。
  2. 确保 OpenCV 的 dll 文件在 PATH 中(或直接在 bin 目录中,如果这是控制台 / WinForms / WPF 应用程序)。

жҳҜзҡ„пјҢе®ғзҡ„е№іеҸ°зӣ®ж ҮжҳҜx86..жҲ‘е·Із»Ҹе°Ҷopencv dllsеҢ…еҗ«еҲ°binзӣ®еҪ•debugж–Ү件еӨ№дёӯпјҢдҪҶд»Қ然еҮәзҺ°зӣёеҗҢзҡ„й”ҷиҜҜ... - Dilshan Zuhdi
1
当异常被抛出时,你能否在调试器中打断点?你可能会在异常详细信息中获得更多的信息。 - jlew
我是新手,不太清楚如何在调试器中打断点。 - Dilshan Zuhdi
在Visual Studio中:调试|异常...|公共语言运行时异常|[选中]已抛出 - jlew

6

将EMGU安装包中bin文件夹中的所有非托管dll复制并粘贴到你的exe文件所在的位置(项目文件夹下的Release或Debug文件夹)。
在我的情况下,非托管dll位于"C:\Emgu\emgucv-windows-universal-cuda 2.9.0.1922\bin\x86"。


在我的情况下,我进行了一次干净的构建,它清除了bin文件夹中的内容。重新安装可以恢复这些文件。以下是默认情况下bin文件夹中的内容:concrt140.dll、cvextern.dll、msvcp140.dll、opencv_ffmpeg330_64.dll和vcruntime140.dll。 - Brian

5

我有这两个文件运行时Windows(x86),vc_redist 2005 -> 2017(x86和x64),.net 4.8。但是有些电脑可以工作,而有些则会抛出异常。是否缺少某些东西? - Trương Quốc Khánh

2

在c#、VS 2017和emgu版本3.2.0.2682中发现了这个问题。

尝试在AnyCPU上进行简单的构建,但收到了坏格式异常。因此,我尝试了x86的坏格式异常,因为评论中可能有建议。最终,我将其设置为x64,它可以正常工作。


2

首先,您需要在项目中添加三个库:opencv_core290.dll,opencv_highgui290.dll和opencv_imgproc290.dll。这里的“290”是指您的OpenCV版本。然后将它们的属性从“不复制”改为“始终复制”。然后保存您的项目。接下来,前往以下位置。如果您的计算机是64位,则前往以下文件夹:“C:\Emgu\emgucv-windows-universal-cuda 2.9.0.1922\bin\x64”,或者如果您使用32位操作系统,则前往“C:\Emgu\emgucv-windows-universal-cuda 2.9.0.1922\bin\x86”,并复制该文件夹中的所有dll文件,并将其粘贴到您的项目/bin/debug/文件夹中。然后重新构建您的项目。然后它就可以正常工作了。

祝您好运!!!


2

您需要将依赖的dll添加到项目中,并将 '复制到输出目录' 属性更改为 '始终复制'(添加 -> 现有项) 路径为:Emgu\emgucv-windows-universal-cuda 2.9.0.1922\bin\x86

在我的项目中添加以下文件: opencv_core290.dll,opencv_highgui290.dll,opencv_ffmpeg290.dll,opencv_imageproc290.dll 和 cudart32_55.dll


1
我在我的32位操作系统电脑上遇到了同样的问题,持续了3天。我通过将bin和x86文件夹中的所有dll文件复制到system32文件夹中来解决了这个问题。看起来有一些dll文件依赖于其他的,只要全部转移过去就可以正常工作了。我没有时间找出是哪一个。

0

对我来说,问题是通过在Visual Studio中点击解决的:

菜单 -> 项目 -> 属性 -> 构建 -> 首选32位。

这一定是emgu(可能是x86)和我的操作系统x64之间的问题。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接