2016-11-02 15 views
0

私はC#(Windowsフォーム)でプログラミングしています。 EmguCV(3.1)を使用して.aviファイルをキャプチャしたい。キャプチャ中にEmguCV(3.x)でAccessViolationExceptionが発生する

型「System.AccessViolationException」の未処理の例外がSystem.Drawing.dll

に発生しました追加情報:読み取りまたは書き込み保護されているメモリをしようと、私は、ファイルをロードすると、私はこの例外を参照してください。これはしばしば、他のメモリが壊れていることを示します。

この例外の後、私はこのウィンドウを参照してください。ここで

enter image description here

は、ファイルをロードするための私のコードです:

private void LoadVideoFromFile() 
{ 
    OpenFileDialog d = new OpenFileDialog(); 
    d.ShowDialog(); 

    _capture = new Emgu.CV.Capture(d.FileName); 
    _capture.ImageGrabbed += ProcessFrame; 
} 

そしてここでは、aviファイルのファイルを示すために私のコードです

private void ProcessFrame(object sender, EventArgs arg) 
{    
    Action a =() => 
     { 
      UMat captured = new UMat(); 
      Boolean cap = _capture.Retrieve(captured); 

      pictureBox1.Image = captured.Bitmap; 
     }; 

    pictureBox1.Invoke(a); 
} 
+0

デバッグモードで実行していますか、リリースしましたか? – Roman

+0

はい、デバッグで実行していますが、問題は何ですか?デバッグとリリースの違いは何ですか? –

+0

編集して続行する機能を無効にしてください。https://msdn.microsoft.com/en-us/library/ms164926.aspx – Roman

答えて

0

使用可能な場合はOpenCLを使用するUMatを使用します。私がx64のためにコンパイルするのを忘れたので、私はこれをこのようなものに当てたときのほとんどの時間です。それを試して、それが役立つかどうかを見てください。

+0

私のコードをx64用にコンパイルしました。 –

0

OK。私は何が起こっていたかを見るための小さなプログラムを一緒に投げました。私はWinFormsちょっとした猫ではないことに気をつけてください。私はEmguCV v3.1 x64を使用しており、x64用にコンパイルされ、.NET 4.6.1`パブリック部分クラスForm1を使用しています:Form { VideoCapture _capture; bool run = true; public Form1() { InitializeComponent();私はbinフォルダにcvextern.dllとそのほかの扶養をコピーするのを忘れたときに私が受け取った }

private void button1_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog d = new OpenFileDialog(); 
     d.ShowDialog(); 

     tbxFileName.Text = d.FileName; 
     tbxFileName.Refresh(); 
     _capture = new Emgu.CV.VideoCapture(d.FileName); 
     _capture.ImageGrabbed += ProcessFrame; 
     double fps = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps); 
     double frameCount = _capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount); 

     progressBar1.Maximum = 100; 
     progressBar1.Value = 0; 
     progressBar1.Step = 1; 

     int currentFrame = 1; 

     while(run) 
     { 
      if (!_capture.Grab()) 
       run = false; 

      progressBar1.Value = Convert.ToInt32((++currentFrame/frameCount) * 100); 

      Thread.Sleep(Convert.ToInt32(1000.0/fps)); 

      Application.DoEvents(); 
     } 
    } 
    private void ProcessFrame(object sender, EventArgs arg) 
    { 
     Action a =() => 
     { 
      UMat captured = new UMat(); 
      Boolean cap = _capture.Retrieve(captured); 

      pictureBox1.Image = captured.Bitmap; 
      pictureBox1.Refresh(); 
     }; 

     pictureBox1.Invoke(a); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     run = false; 
    } 
} 

` 唯一のエラーです。

これが役に立ちます。

関連する問題