捕获时EmguCV(3.x)中的AccessViolationException

时间:2016-11-02 20:25:21

标签: c# emgucv access-violation

我正在用C#编程(WindowsForm)。我想使用EmguCV(3.1)来捕获.avi文件。当我加载文件时,我看到了这个例外:

  

System.Drawing.dll中出现未处理的“System.AccessViolationException”类型异常

     

附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

在此异常之后,我看到了这个窗口:

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

2 个答案:

答案 0 :(得分:0)

您正在使用使用OpenCL的UMat(如果可用)。大部分时间我碰到这样的事情是因为我忘了为x64编译。试试看,看看是否有帮助。

答案 1 :(得分:0)

行。我把一个小程序汇总在一起,看看发生了什么。请注意,我不是一个WinForms有点猫。我正在使用EmguCV v3.1 x64,为x64编译并使用.NET 4.6.1`公共部分类Form1:表单     {         VideoCapture _capture;         bool run = true;         公共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及其他家属复制到bin文件夹时。

希望这有帮助。