无法在C#项目中加载cvextern

33

我正在使用C#中的emgu和HaarCascade调试程序,遇到如下异常:

无法加载DLL文件“cvextern”:找不到指定的模块。(HRESULT异常:0x8007007E)

我已将cvextern.dll文件添加到项目中,并在文件属性中尝试了“始终复制”和“仅在更新时复制”选项。此外,构建平台为x64。

以下是我部分编写的代码:

    private void Load_Click(object sender, EventArgs e)
    {
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.Filter = "Photo Files (*.jpg)|*.JPG";
        dlg.CheckFileExists = true;
        if (dlg.ShowDialog() == DialogResult.OK)
        {
            Image<Bgr, Byte> My_Image = new Image<Bgr, byte>(dlg.FileName);
            HaarCascade face = new HaarCascade("haarcascade_frontalface_alt.xml");

而异常在最后一行。

11个回答

22

只需安装:此 NuGet 包

由于存在一些非托管代码,您必须在项目中添加这些引用。

请参阅变更日志


1
在.NET项目中不可能实现这一点。严重性 代码 描述 项目 文件 行 抑制状态 错误 无法安装软件包'Emgu.runtime.windows.msvc.rt.arm64 19.33.31630'。您正在尝试将此软件包安装到目标为'.NETFramework,Version = v4.7.2'的项目中,但该软件包不包含与该框架兼容的任何程序集引用或内容文件。有关更多信息,请联系软件包作者。 - Seth
@Seth,你应该选择正确的版本或降低你的目标框架。 - Ali Besharati
1
除了指定的版本外,没有其他版本。我无法降级目标框架。我只是用Python编写它,然后使用参数从我的C#程序中调用Python。 - Seth
我将"Windows"替换为"Ubuntu"后,一切都正常运行。 - ehsan wwe

21

你收到的错误不仅仅是cvextern引起的,这个dll实际上指向几乎所有其他opencv dll,并且所有这些dll都是必需的。在遇到这个错误时,您需要在项目中加入以下dll。

请注意,“220”是版本号,根据更新而变化。

  • cudart64_32_16.dll
  • cufft64_32_16.dll
  • cvextern.dll
  • npp64_32_16.dll
  • opencv_calib3d220.dll
  • opencv_contrib220.dll
  • opencv_core220.dll
  • opencv_features2d220.dll
  • opencv_flann220.dll
  • opencv_gpu220.dll
  • opencv_highgui220.dll
  • opencv_imgproc220.dll
  • opencv_legacy220.dll
  • opencv_ml220.dll
  • opencv_objdetect220.dll
  • opencv_video220.dll

我的codeproject文章中也介绍了此错误及其他错误。

如果有其他问题,请告诉我,

谢谢,

Chris


我刚刚下载了OpenCv 2.4.10版本,但是我找不到文件cudart64_32_16.dll、cufft64_32_16.dll、cvextern.dll和npp64_32_16.dll。这些文件还需要吗?如果需要,它们并没有在build > x86 > vc12 > bin目录下。请问我应该在哪里找到它们? - RyeGuy
我真的需要在目标计算机上安装所有这些dll才能运行emgu.world中的一个简单函数吗?我如何知道需要哪一个精确的dll? - ephraim

13

我在使用 Emgu CV 3.1 时遇到了这个错误,我找到了以下可行的解决方案:

cvextern.dll 复制到应用程序目录下的 \bin\Debug\ 文件夹中。

希望能帮到您。


1
这个问题只在使用Emgu在Windows Forms用户控件项目中出现,该项目创建的是dll而不是.exe时才会出现。在同一台机器上使用Emgu的Windows Forms应用程序可以正常工作。我通过将cvextern.dll从<project>/bin/Debug/x64复制到<project>/bin/Debug来解决它。问题可能与dll需要引用相同文件夹中的引用dll有关,而.exe可以引用其他地方的dll。 - SimonKravis
问题出现在使用Emgu.CV的应用程序的Windows 8.1 64位安装中,但在Windows 10安装中没有出现。尝试将cvextern.dll从/x64复制到上面的文件夹(其中包含可执行文件),但然后我会收到Bad Image Format异常。这可能与Win8作为32位和64位操作系统有关吗? - SimonKravis

4

你是对的!将目标更改为x64解决了我的问题。 - undefined

2

我通过以下步骤解决了这个问题:

  • 右键单击项目名称,选择添加,选择添加现有项。然后选择Emgu\libs\x64文件夹中的所有文件以添加到项目中(如果被询问是否替换旧文件,请允许替换)。
  • 然后您需要选择所有新添加的文件,右键单击并选择属性,在“复制到输出”部分中选择“始终复制”。

完成。


2

cvextern.dll应该放在Windows\System32文件夹下,如果是x64系统则应放在Windows\SysWOW64文件夹下。 这对我很有效。 附注:我使用了NuGet包'EmguCV' v3.1.0.1和VS2015。


1

我遇到了同样的错误信息,但这些解决方案都不适用于我。(讨厌在常见问题的边缘情况下出现变体...)最终花了几个小时才找到解决方法。

我正在使用ClickOnce部署,使用Nuget安装的Emgu.CV版本为4.1.1.3497。它可以在Visual Studio中很好地运行,但ClickOnce安装无法运行。(在同一台计算机上!)我在项目源文件夹中找到了缺失的DLL(对我来说是:...\Visual Studio 2015\Projects\MyProjectName\packages\EMGU.CV.4.1.1.3497\build)。但由于某种原因,它们没有被包含在项目发布选项卡的应用程序文件中,因此没有包含在ClickOnce安装中。一旦我弄清楚了这一点,解决方案就很简单——只需将DLL添加到项目中,并将属性设置为“内容”/“始终复制”。


1

对于版本2.3,它的列表增加了opencv_ffmpeg.dll和opencv_flann231.dll。


0
在我的情况下,我已经切换到了64位目标,但没有注意到,转换为x86就解决了这个问题。

0

您可以通过在Visual Studio 2019的Nuget包管理器中安装它来解决此问题 工具> NuGet包管理器 > 包管理器控制台

然后使用以下命令进行安装

  • Install-Package Emgu.CV
  • Install-Package Emgu.CV.runtime.windows

这样我就解决了所有问题。


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