System.AccessViolationException: необработанная ошибка при записи видео с использованием emgu CV

Я пытаюсь захватить видео с помощью EMGU CV в Visual Studio 2010, но когда он выполняет строку

video.WriteFrame<Bgr, byte>(marked);

я получаю следующую ошибку:

System.AccessViolationException не было обработано

Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.

private void button3_Click_1(object sender, EventArgs e)
    {
        Capture camera = new Capture();
        if (camera == null)
        {
            MessageBox.Show("can't find a camera", "error");
        }
        double fps = camera.GetCaptureProperty(CAP_PROP.CV_CAP_PROP_FPS);
        double cpHeight = camera.GetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT);
        double cpWidth = camera.GetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_WIDTH);
        double fourcc = camera.GetCaptureProperty(CAP_PROP.CV_CAP_PROP_FOURCC);
        CvInvoke.cvNamedWindow("camera");
        Image<Bgr, byte> temp = camera.QueryFrame();
        //路径
        SaveFileDialog SaveFileDialog1 = new SaveFileDialog();
        SaveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
        SaveFileDialog1.Filter = "Image Files(*.avi)|*.avi|All files (*.*)|*.*";
        if (SaveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            MessageBox.Show("START RECORD,ESC TO STOP");
        }
        VideoWriter video = new VideoWriter(SaveFileDialog1.FileName, (int)fourcc, 15, 800, 600, true);
        while (temp != null)
        {
            CvInvoke.cvShowImage("camera", temp.Ptr);
            temp = camera.QueryFrame();
            int c = CvInvoke.cvWaitKey(20);
            Image<Bgr, byte> marked = faceDetection(temp);
            video.WriteFrame<Bgr, byte>(marked);
            if (c == 27) break;
        }
        video.Dispose();
        camera.Dispose();
        CvInvoke.cvDestroyWindow("camera");
    }

Кто-нибудь знает, что может быть причиной этого?

Спасибо

Эван


person Evan Evanson Evans    schedule 06.06.2012    source источник


Ответы (2)


после изменения порядка следующих строк он отлично сработал для меня. также проверьте, что отмечен не является нулевым. если помечено как null, это приведет к ошибке нарушения доступа.

while (temp != null)
{
    CvInvoke.cvShowImage("camera", temp.Ptr);

    Image<Bgr, byte> marked = faceDetection(temp);
    video.WriteFrame<Bgr, byte>(marked);

    int c = CvInvoke.cvWaitKey(20);
    if (c == 27) break;

    temp = camera.QueryFrame();
}
person Nikson Kanti Paul    schedule 01.07.2012

Извините за поздний ответ, но, возможно, кому-то это будет полезно.

Я сам сейчас борюсь с этой ошибкой (в разных обстоятельствах) и похоже проблема в попытке включить 32-битные компоненты в мой проект на 64-битной винде.

В 32-битной системе он работает отлично, в 64-битной у меня есть "System.AccessViolationException was unhandled"

К сожалению, в моем случае мало что можно сделать, просто отказаться от компонента и сделать это по-другому.

Может и здесь проблема. Что такое VideoWriter, не похоже на стандартный класс .NET?

person RRM    schedule 25.10.2013