Как сохранить снимок IP-камеры в папке Content, используя EmguCV c # - PullRequest
0 голосов
/ 23 января 2019

Я использую EmguCV 3.4.Мне нужно хранить снимки с IP-камеры периодически (5 минут).Я пытаюсь сохранить снимки в папке Content (ASP.NET MVC).Я получил исключение нарушения доступа.Помоги мне.Мой код,

private VideoCapture _capture = null;
private Mat _frame;

public void GetSnapshot(CameraDTO cameraDTO)
{
    CvInvoke.UseOpenCL = false;
    try
    {
        _capture = new VideoCapture(cameraDTO.CameraAccessURL);
        _capture.ImageGrabbed += ProcessFrame;

        if (StartCapture())
        {
            while (_frame == null)
            {
                //wait untill camera ready
            }

            if (_frame != null && _capture != null)
            {
                Image<Bgr, Byte> imgeOrigenal = _frame.ToImage<Bgr, Byte>();
                imgeOrigenal.Save(@ImageSavepath + @"\ImageFromCamera" + cameraDTO.camID + ".jpg");
            }
        }
    }
    catch (Exception excpt)
    {
    Console.WriteLine(excpt.Message);
    }
}

private bool StartCapture()
{
    if (_capture != null)
    {
        _capture.Start();
        return true;
    }
    return false;
}

private void ProcessFrame(object sender, EventArgs e)
{
    try
    {
        if (_capture != null && _capture.IsOpened && _capture.Ptr != IntPtr.Zero && _frame != null)
        {
            _frame = new Mat();
            _capture.Retrieve(_frame, 0);
        }
    }
    catch (AccessViolationException exv)
    {
        Console.WriteLine("ERROR: {0}", exv.Message);
        return;
    }
    catch (Exception ex)
    {
        Console.WriteLine("ERROR: {0}", ex.Message);
        return;
    }
}

@ ImageSavepath = Папка содержимого, случайным образом создайте проблему

1 Ответ

0 голосов
/ 23 января 2019

Проблема в том, что вы используете _frame в другом потоке (манипулирование между потоками).Вы должны сохранить изображение внутри FrameProcess().

private void FrameProcess(object sender, EventArgs e)
    {
        try
        {
            if (_capture != null && _capture.IsOpened && _capture.Ptr != IntPtr.Zero && _frame != null)
            {
                _frame = new Mat();
                _capture.Retrieve(_frame, 0);
                Image<Bgr, Byte> imgeOrigenal = _frame.ToImage<Bgr, Byte>();
                imgeOrigenal.Save(@ImageSavepath + @"\ImageFromCamera" + cameraDTO.camID + ".jpg");
            }
        }
        catch (AccessViolationException exv)
        {
            Console.WriteLine("ERROR: {0}", exv.Message);
            return;
        }
        catch (Exception ex)
        {
            Console.WriteLine("ERROR: {0}", ex.Message);
            return;
        }
    }
...