2016-11-02 8 views
0

Я программирую на C# (WindowsForm). Я хочу использовать EmguCV (3.1) для захвата файла .avi. Когда я загружаю файл я вижу это исключение:AccessViolationException в EmguCV (3.x) при захвате

Необработанное исключение типа «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

Вы a с использованием UMat, который использует OpenCL, если он доступен. Большую часть времени, когда я нажимал такие вещи, это потому, что я забыл скомпилировать для x64. Попробуйте это и посмотрите, поможет ли это.

+0

Я скомпилировал свой код для x64. –

0

OK. Я собрал небольшую программу, чтобы посмотреть, что происходит. Имейте в виду, что я не кошка-любитель WinForms. Я использую EmguCV v3.1 x64, скомпилированный для x64 и использующий .NET 4.6.1` public partial class Form1: Form { VideoCapture _capture; bool run = true; public Form1() { InitializeComponent(); }

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; 
    } 
} 

` Единственная ошибка я получил, когда я забыл скопировать cvextern.dll и другие его иждивенцам в папку бин.

Надеюсь, это поможет.