Emgu.CV.CvInvoke'引发了一个例外

时间:2012-09-19 05:01:53

标签: c# computer-vision emgucv

我正在尝试将EMGUCV用于C#。目前我已经安装了Visual Studio 2010 Express Edition。当试图执行一些简单的命令时,Emgu.CV.CvInvoke引发了异常,所以我将非托管代码放在exe文件夹中。但它仍然继续给我错误。所以我尝试将非托管代码添加到解决方案资源管理器中,但它仍然给我这个错误。还有什么我可以做的,所以我终于可以使用emguCV了吗?

例外是

System.TypeInitializationException was unhandled 
   Message=The type initializer for 'Emgu.CV.CvInvoke' threw an exception.

有堆栈跟踪:

   at Emgu.CV.CvInvoke.cvCreateCameraCapture(Int32 index)
   at Emgu.CV.Capture..ctor(Int32 camIndex) in C:\Program Files (x86)\Emgu\libemgucv-windows-x64-2.2.1.1150\Emgu.CV\Capture\Capture.cs:line 105
   at Emgu.CV.Capture..ctor() in C:\Program Files (x86)\Emgu\libemgucv-windows-x64-2.2.1.1150\Emgu.CV\Capture\Capture.cs:line 93
   at cameraWorks.Form1.camButton_Click(Object sender, EventArgs e) in C:\Users\Adrian\documents\visual studio 2010\Projects\cameraWorks\cameraWorks\Form1.cs:line 38
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at cameraWorks.Program.Main() in C:\Users\Adrian\documents\visual studio 2010\Projects\cameraWorks\cameraWorks\Program.cs:line 18
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

的InnerException:

  

InnerException:System.BadImageFormatException          消息=尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)          来源= Emgu.CV          堆栈跟踪:               在Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler,IntPtr userdata,IntPtr prevUserdata)               在C:\ Program Files(x86)\ Emgu \ libemgucv-windows-x64-2.2.1.1150 \ Emgu.CV \ PInvoke \ CvInvoke.cs:第50行的Emgu.CV.CvInvoke..cctor()中

我只执行一些简单的代码:

public partial class Form1 : Form
{
    private Capture capture;
    private bool captureInProgress;

    public Form1()
    {
        InitializeComponent();
    }

    private void ProcessFrame(Object sender, EventArgs args )
    {
        Image<Bgr, Byte> ImageFrame = capture.QueryFrame();
        CamImageBox1.Image = ImageFrame;
    }

    private void camButton_Click(object sender, EventArgs e)
    {
        if (capture == null)
        {
            try
            {
                capture = new Capture();
            }
            catch (NullReferenceException excpt)
            {
                MessageBox.Show(excpt.Message);
            }
        }

        if (capture != null)
        {
            if (captureInProgress)
            {
                camButton.Text = "start";
            }
            else
            {
                camButton.Text = "stop";
                Application.Idle += ProcessFrame;
            }
            captureInProgress = !captureInProgress;
        }
    }

    private void ReleaseData()
    {
        if (capture != null)
        {
            capture.Dispose();
        }
    }

emguCV的示例在我的计算机上运行。 非常感谢 阿德里安

1 个答案:

答案 0 :(得分:3)

以下错误:&#34;尝试加载格式不正确的程序。&#34;如果为不同的平台编译非托管程序集而不是.NET代码当前正在执行,则显示。

例如:     拿一些为x86编译的dll,将一些函数调用导入C#并运行。如果你有64位Windows,这将失败,因为.NET代码被编译为x64。

要克服这个问题,您有两种可能:             1)使用与您的平台匹配的非托管DLL版本             2)项目 - &gt;属性 - &gt;构建 - &gt;勾选与编译非托管dll的平台匹配的平台(x86,x64)(可能设置为Any CPU)。


将非托管dll复制到\​​ bin \ Debug和/或\ bin \ Release项目中,而不是复制到某个子文件夹中! 如果你真的想使用某个子文件夹中的dll,那么就像这样编辑进程环境变量:

Environment.SetEnvironmentVariable(path,Environment.GetEnvironmentVariable(path)+ Path.PathSeparator +);

这会将您的子文件夹添加到搜索路径中。此变量是过程变量,意味着当进程停止执行时,所有更改都将被撤消。