使用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;
}
}
´´´