Emgu发现网络摄像头连接丢失每次都不起作用

时间:2019-07-18 13:59:22

标签: c# video-capture emgucv

使用emguCV(3.4.3)及其视频捕获类时遇到了问题。

我正在Win10虚拟机上进行开发,当我的网络摄像头断开连接时,我的代码可以非常准确地检测到。但是,当我在Win7机器上执行它的编译和安装版本时,除断开连接检测之外的所有内容都可以正常工作。

现在我想知道为什么...

我已将空闲的应用程序绑定到事件处理程序。每次事件发生时,都会抓取图像作为帧并进行处理。

我正在使用.Retrieve(_frame)方法,因为它是少数成功返回布尔值的方法之一。然后,我用这个布尔值决定下一步要做什么。

此外,我已经实现了bool心跳,在完成处理后将其设置为true。在计时器中此布尔值将变为假。

RetrieveSuccessful始终为true,尽管实际上已断开了相机的电源。因此无法检测到连接丢失。 在不更改代码的情况下执行相同的过程,可以完美地检测到丢失。

public Form1()
{
   ...
   InitilizeWebcam()
   Application.Idle += new EventHandler(Application_Idle);
}


private bool InitilizeWebcam()
{
    CvInvoke.UseOpenCL = false;
    try
    {
        _capture = new VideoCapture();
        ApplyCameraSettings();
        _capture.ImageGrabbed += ProcessFrame;
        return true;
    }
    catch (NullReferenceException excpt)
    {
        MessageBox.Show(excpt.Message);
        return false;
    }
}

private void Application_Idle(object sender, EventArgs e)
{
    if (TSMI_Camera.Checked == false && HasFilterChanged == true) //Processing a still Image
    {
        ProcessFrame(this, e);
        HasFilterChanged = false;
    }
    if (_captureInProgress == true && HasFilterChanged == true)
    {
        ProcessFrame(this, e);
        HasFilterChanged = false;
    }
}

//frame processing
private void ProcessFrame(object sender, EventArgs arg)
{
    if (_capture != null && _capture.Ptr != IntPtr.Zero && TSMI_Camera.Checked == true) //Processes a frame from the camera
    {
        bool RetrieveSuccessful = false;

        RetrieveSuccessful = _capture.Retrieve(_frame, 0);

        if(RetrieveSuccessful == true)
        {
            _frame = ApplyFilter(_frame);
            try
            {
                captureImageBox.Image = _frame;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message); ;
            }
            //captureImageBox.Image = _frame;

            Invoke(new Action(() => { captureImageBox.SizeMode = PictureBoxSizeMode.Normal; }));

            CameraHeartBeat = true;

            Invoke(new Action(() => { StatusBarCameraStatus.BackColor = Color.Blue; }));
        }
        else
        {
            _captureInProgress = false;
            _capture.Dispose();
            _capture.Stop();
        }
    }
    else if (UseStillImage == true) //Processes a frame from a loaded file
    {
        ...
    }
}

//Timer
private void T_IsCameraStillAvailable_Tick(object sender, EventArgs e)
{
    if (CameraHeartBeat == true)
    {
        StatusBarCameraStatus.BackColor = Color.Red;
        CameraHeartBeat = false;
        StatusBarCameraStatus.Text = "Camera online";

        lbl_cmd_ReconnectCamera.Visible = false;
        lbl_cmd_ReconnectCamera.Enabled = false;
    }
    else
    {
        StatusBarCameraStatus.Text = "Camera offline.";

        lbl_cmd_ReconnectCamera.Visible = true;
        lbl_cmd_ReconnectCamera.Enabled = true;

        TSMI_Camera_Start.Text = "Start capture";
        _captureInProgress = false;

    }
}

´´´

0 个答案:

没有答案