EmguCV cvextern System.DllNotFoundException

时间:2016-03-12 07:45:18

标签: .net dll emgucv

我正在尝试在EmguCV 3.1中运行LicensePlateRecognition的示例。但我总是得到错误System.DllNotFoundException,并且消息是“无法加载cvextern.dll”。我使用Visual Studio 2013运行Windows 7(计算机由我公司提供)。

我将文件夹中的所述dll和其他一些dll复制到debug文件夹(配置文件设置为调试模式,我尝试了x86和x64版本)。在一次又一次地收到错误后,我开始怀疑这是因为我的视频卡驱动程序(一些谷歌搜索结果如此)。我更新了,错误仍然存​​在。

经过一些谷歌搜索,我找到了依赖步行者。缺少一个文件“IEShims.dll”。我下载并将其放入调试文件夹中,但没有运气。

我认为有些输出可能是相关的。

  

从C:\ Emgu \ emgucv-windesktop 3.1.0.2282 \ bin \ x64

加载打开的cv二进制文件      

LoadLibraryEx C:\ Emgu \ emgucv-windesktop 3.1.0.2282 \ bin \ x64 \ opencv_ffmpeg310_64.dll失败,错误代码为87:参数不正确。

     

无法加载文件C:\ Emgu \ emgucv-windesktop 3.1.0.2282 \ bin \ x64 \ opencv_ffmpeg310_64.dll。

     

LoadLibraryEx C:\ Emgu \ emgucv-windesktop 3.1.0.2282 \ bin \ x64 \ cvextern.dll失败,错误代码为87:参数不正确。

     

无法加载文件C:\ Emgu \ emgucv-windesktop 3.1.0.2282 \ bin \ x64 \ cvextern.dll。

有谁知道这有什么问题?

错误似乎源于

#if !UNITY_IPHONE
     //Use the custom error handler
     RedirectError(CvErrorHandlerThrowException, IntPtr.Zero, IntPtr.Zero);
#endif

方法

  /// <summary>
  /// Attempts to load opencv modules from the specific location
  /// </summary>
  /// <param name="modules">The names of opencv modules. e.g. "opencv_cxcore.dll" on windows.</param>
  /// <returns>True if all the modules has been loaded successfully</returns>
  public static bool DefaultLoadUnmanagedModules(String[] modules)

我尝试了一整天才找到解决方案,但我真的不知道我现在能做什么。任何帮助表示赞赏。

编辑:我也没试过TlbImp。

  

TlbImp:错误TI1002:输入文件“D:\ Resources \ cvextern.dll”不是有效的类型库。

5 个答案:

答案 0 :(得分:8)

在将项目从Emgu 3.1.0.2282升级到3.1.0.2504-r16.12时遇到类似问题后我找到了这个页面

在我的情况下,这是因为我的Win10计算机没有安装Visual C++ Redistributable for Visual Studio 2015

更具体地说,在Emgu 3.1.0.2282中,&#34; x86&#34;和&#34; x64&#34;包含msvcr120.dllmsvcp120.dll的文件夹,而在3.1.0.2504中,这些文件夹现在包含vcruntime140.dllmsvcp140.dll

更改日志或安装说明中没有提到新依赖项,并且没有迹象表明cvextern.dll由于可视化C运行时而失败 - 只有错误bin\Debug\x64\cvextern.dll failed with error code 126: The specified module could not be found

我不需要复制DLL文件来解决这个问题:我的bin目录只包含Emgu.CV.UIEmgu.CV.World DLL文件,以及&#34; x86&#34;和&#34; x64&#34;文件夹(每个包含4个DLL)。我提到这一点是为了引导人们远离谷歌将提出的所有建议,这些建议适用于旧版本的Emgu。

答案 1 :(得分:1)

我遇到了和你一样的问题。我写了一个基于EmguCV3.1的应用程序。它在我的开发PC上运行良好,但是一旦我将发布版本复制到另一台PC而没有安装任何开发工具,我就得到了错误。测试PC系统环境是Windows 7 64位。

最后,我发现只需将emgucv安装目录中的所有.dll文件复制到您的发布文件夹中,例如:D:\ Emgu \ emgucv-windesktop 3.1.0.2282 \ bin \ x64或bin / x86。这些DLL包括cvextern.dll,msvcp120.dll,msvcr120.dll,opencvffmpeg310.dll。对于64位系统,我从bin \ 64文件夹中复制dll。

根据您的情况,我建议您将bin \ x64或bin \ x86文件夹目录添加到系统路径环境中。

参考:

EmguCV official wiki about this problem但是没有必要为版本3.1添加这么多dll。

And Try to check your configuration of emgucv as wiki said

  

对于3.0+版本,所需的vcrt dll包含在&#34; x86&#34;和&#34; x64&#34;夹。只要您复制&#34; x86&#34;中的所有非托管dll,您就会做好准备。和&#34; x64&#34;文件夹到可执行文件夹。

答案 2 :(得分:1)

由于目标计算机上缺少C ++运行时文件,因此发生错误。它们可以是downloaded并从Microsoft安装。

答案 3 :(得分:0)

我遇到的另一个问题(与cvextern无法加载相同的症状)在Windows Server上运行(在Azure云中)是对Windows Media Foundation的依赖。对于它的价值,默认情况下不会在Windows Server 2012上安装。有几种补救措施:

  1. 按照in this question about MF support on 2012
  2. 所述添加功能
  3. 使用Server 2016(系列5)(已安装MF)

答案 4 :(得分:0)

从 4.2 版开始,所有内容都包含在 NuGet 中: https://www.nuget.org/packages/Emgu.CV.runtime.windows/

如果您选择 x86 或 x64(不是 AnyCPU),则会部署 DLL。