2016-11-02 2 views
0

저는 C# (WindowsForm)에서 프로그래밍 중입니다. EmguCV (3.1)를 사용하여 .avi 파일을 캡처하고 싶습니다.캡처 중 EmguCV (3.x)에서 AccessViolationException이 발생했습니다.

유형 'System.AccessViolationException'처리되지 않은 예외는 System.Drawing.dll

에 추가 정보를 발생 : 보호 된 메모리를 읽거나 쓰려고 시도 내가 파일을로드 할 때 나는이 예외를 참조하십시오. 이것은 종종 다른 메모리가 손상되었다는 표시입니다.

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

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

그리고 여기가 AVI 파일을 보여주는 내 코드입니다 :

여기

enter image description here

파일을로드 할 수 내 코드입니다 :

이 예외 후 나는이 창을 참조

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

확인. 나는 무슨 일이 일어나고 있는지보기 위해 약간의 프로그램을 던졌다. 내가 WinForms의 고양이가 아닐까 싶다. 나는 x64 용으로 컴파일 된 EmguCV v3.1 x64를 사용하고 .NET 4.6.1` public partial class 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; 
    } 
} 

` .

희망이 도움이됩니다.

관련 문제