3

C# に EMGUCV を使用しようとしています。現在、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: System.BadImageFormatException Message=不正な形式のプログラムを読み込もうとしました。(HRESULT からの例外: 0x8007000B) Source=Emgu.CV StackTrace: at Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata) at Emgu.CV.CvInvoke..cctor() in C:\Program Files ( x86)\Emgu\libemgucv-windows-x64-2.2.1.1150\Emgu.CV\PInvoke\CvInvoke.cs:50行目

私はいくつかの単純なコードを実行しているだけです:

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 の例は私のコンピューターで動作します。ありがとうエイドリアン

4

1 に答える 1

4

次のエラー: 「不正な形式のプログラムを読み込もうとしました。」アンマネージ アセンブリが、.NET コードが現在実行されているプラ​​ットフォームとは異なるプラットフォーム用にコンパイルされている場合に表示されます。

例: x86 用にコンパイルされた dll を取り、関数呼び出しを C# にインポートして実行します。64 ビットの Windows を使用している場合、.NET コードは x64 にコンパイルされるため、これは失敗します。

これを克服するには、次の 2 つの方法があります。1) プラットフォームに一致するアンマネージド dll バージョンを使用する 2) [プロジェクト] -> [プロパティ] -> [ビルド] -> アンマネージド dll がコンパイルされているプラ​​ットフォーム (x86、x64) に一致するプラットフォームにチェックマークを付けます (おそらくAny CPUに設定されています)。


管理されていない dll を、サブフォルダーではなく、\bin\Debug および/または \bin\Release プロジェクトにコピーしてください!! サブフォルダーの dll を本当に使用したい場合は、プロセス環境変数を次のように編集します。

Environment.SetEnvironmentVariable(パス、Environment.GetEnvironmentVariable(パス) + Path.PathSeparator + );

これにより、サブフォルダーが検索パスに追加されます。この変数はプロセス変数であり、プロセスの実行が停止するとすべての変更が取り消されることを意味します。

于 2014-04-04T07:37:47.760 に答える