System.TypeInitializationException с использованием Emgu.CV в C # - PullRequest
1 голос
/ 22 сентября 2011

На данный момент у меня есть функция, которая вызывает изображение из интерфейса моей камеры. Затем это изображение сохраняется на жестком диске и также отображается в графическом интерфейсе Windows Forms.

Функция внутри интерфейса камеры, которая возвращает изображение, выглядит следующим образом: высота и ширина являются целыми числами, которые являются частью класса интерфейса камеры. В этом случае они были установлены на 800x600.

public Image<Bgr,byte> QueryFrame()
{
    Image<Bgr, byte> temp;
    lock (key)
    {
        using (Capture cap = new Capture())
        {
            cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, height);
            cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, width);
            temp = cap.QueryFrame().Copy();
        }
    }
    return temp;
}

При вызове этой функции несколько раз выяснялось, что захват кадра занимал сравнительно много времени, блокируя программу на несколько секунд. Затем, после захвата нескольких кадров при запуске программы в Debug с Visual C # 2010, выскочила ошибка Windows для vshost.exe:

Faulting application DashboardGUI.vshost.exe, version 10.0.30319.1, time stamp 0x4ba2084b, faulting module MSVCR90.dll, version 9.0.30729.6161, time stamp 0x4dace5b9, exception code 0xc0000005, fault offset 0x00024682, process id 0xe78, application start time 0x01cc792086025f01.

Затем я приступил к публикации приложения, запустил его из исполняемого файла и получил ошибку:

Application: DashboardGUI.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.TypeInitializationException
Stack:
   at Emgu.CV.CvInvoke.cvReleaseCapture(IntPtr ByRef)
   at Emgu.CV.Capture.DisposeObject()
   at Emgu.Util.DisposableObject.Finalize()

Однако у меня также было то же исключение с Emgu.CV.CvInvoke.cvCreateCameraCapture (Int32).

Что вызывает эти проблемы? Как их можно избежать? И есть ли способ сделать захват кадра быстрее, чем в настоящее время (когда он не падает)?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Я посмотрел на ваш код и вижу проблему. Я ожидаю, что причина этого сбоя в том, что я использовал предложение using Извините: s. Ну, не совсем с использованием заявления. Похоже, вы часто обращаетесь к коду, чтобы система могла с ним справиться.

Capture cap = new Capture()

Выполняет большое количество операций для небольшого объема кода. Он не только устанавливает связь с вашей камерой, но и проверяет ее наличие, обрабатывает драйверы, создает кольцевые буферы и т. Д. Теперь, хотя приведенный код гарантирует, что возвращается только обновленное изображение, он, как правило, работает хорошо, только если вы используете кнопку или таймер с период задержки. Теперь, когда я осознаю, что вы пытаетесь достичь, и поскольку вы хотите получать изображения более регулярно, чем то, что может быть разумно достигнуто с помощью этого метода, у вас есть более практичный вариант.

Настройте устройство Capture глобально и настройте его на запись и вызов ProcessFrame для получения изображения из буфера, когда это возможно. Теперь измените ваш QueryFrame, просто скопировав кадры, которые только что были получены. Мы надеемся, что это решит проблему получения предыдущего кадра, и теперь у вас будет самый последний кадр из буфера.

private Capture cap;
Image<Bgr, Byte> frame;

public CameraCapture()
{
    InitializeComponent();
    cap= new Capture();
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, height);
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, width);

    Application.Idle += ProcessFrame;
}

private void ProcessFrame(object sender, EventArgs arg)
{
    frame = _capture.QueryFrame();
    grayFrame = frame.Convert<Gray, Byte>();
}

public Image<Bgr,byte> QueryFrame()
{
    return frame.Copy();
}

Надеюсь, это поможет вам найти решение на этот раз, и извините, другой метод был бесполезен,

Приветствие Chris

1 голос
/ 27 марта 2014

http://www.emgu.com/wiki/index.php/Setting_up_EMGU_C_Sharp - это действительно помогло мне, когда я застрял в той же проблеме, это может стоить посмотреть.

...