Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EmguCV cvextern System.DllNotFoundException

Tags:

.net

dll

emgucv

I am trying to run the example of LicensePlateRecognition in EmguCV 3.1. But I always get the error System.DllNotFoundException and the message is that "cvextern.dll cannot be loaded". I am running Windows 7 with Visual Studio 2013 (the computer is provided by my company).

I copied the said dll and some other dlls in the folder to the debug folder (the profile is set to debug mode, and I tried both x86 and x64 versions). After getting the error again and again I started to suspect that it's because of my video card driver (some Google results suggested so). I updated that and the error persisted.

After some more Googling, I found the Dependency Walker. One file "IEShims.dll" is missing. I downloaded that and put it into the debug folder with no luck.

Some output I think might be relevant.

Loading open cv binary from C:\Emgu\emgucv-windesktop 3.1.0.2282\bin\x64

LoadLibraryEx C:\Emgu\emgucv-windesktop 3.1.0.2282\bin\x64\opencv_ffmpeg310_64.dll failed with error code 87: The parameter is incorrect.

File C:\Emgu\emgucv-windesktop 3.1.0.2282\bin\x64\opencv_ffmpeg310_64.dll cannot be loaded.

LoadLibraryEx C:\Emgu\emgucv-windesktop 3.1.0.2282\bin\x64\cvextern.dll failed with error code 87: The parameter is incorrect.

File C:\Emgu\emgucv-windesktop 3.1.0.2282\bin\x64\cvextern.dll cannot be loaded.

Does anyone know what's wrong with that?

The error seems to be stemmed from

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

Which is in the method

  /// <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)

I tried a whole day to find the solution but I really don't know what I can do now. Any help is appreciated.

EDIT: I also tried TlbImp with no luck.

TlbImp : error TI1002 : The input file 'D:\Resources\cvextern.dll' is not a valid type library.

like image 366
LLS Avatar asked Mar 12 '16 07:03

LLS


3 Answers

I found this page after encountering a similar problem when upgrading a project from Emgu 3.1.0.2282 to 3.1.0.2504-r16.12

In my case it was because my Win10 computer did not have Visual C++ Redistributable for Visual Studio 2015 installed.

More specifically, in Emgu 3.1.0.2282 the "x86" and "x64" folders contained msvcr120.dll and msvcp120.dll, while in 3.1.0.2504 those folders now contain vcruntime140.dll and msvcp140.dll.

The new dependency isn't mentioned in the changelog or installation instructions, and there was no indication that cvextern.dll was failing because of the visual C runtime - only the error bin\Debug\x64\cvextern.dll failed with error code 126: The specified module could not be found

I've not needed to copy DLL files around to fix this: my bin directory contains only the Emgu.CV.UI and Emgu.CV.World DLL files, plus the "x86" and "x64" folders (containing 4 DLLs each). I mention this to steer people away from all the advice Google will pull up which was intended for older versions of Emgu.

like image 170
Treer Avatar answered Sep 20 '22 10:09

Treer


I met the same problem as you. I wrote an application based on EmguCV3.1. It works well on my development PC, but once I copied a release version to another PC without installing any development tools, I got the error. And the test PC system environment is Windows 7 64bit.

Finally, I found that just copy all .dll files from your emgucv install dir such as: D:\Emgu\emgucv-windesktop 3.1.0.2282\bin\x64 or bin/x86 to your release folder. These dll include cvextern.dll, msvcp120.dll, msvcr120.dll, opencvffmpeg310.dll. For 64bit system I copy the dlls from bin\64 folder.

For your situation, I advise you add the bin\x64 or bin\x86 folder dir to the system path environment.

Reference:

EmguCV official wiki about this problem But thers is no necessary to add so much dll for version 3.1.

And Try to check your configuration of emgucv as wiki said:

For Version 3.0+, the required vcrt dlls are included in the "x86" and "x64" folder. You will be ready as long as you copy all the unmanaged dlls in the "x86" and "x64" folder to the folder of executable.

like image 43
very hit Avatar answered Sep 20 '22 10:09

very hit


Starting with version 4.2 everything is included in the NuGet here: https://www.nuget.org/packages/Emgu.CV.runtime.windows/

The DLL's are deployed if you select x86 or x64 (not AnyCPU).

like image 21
r2d2 Avatar answered Sep 23 '22 10:09

r2d2