I'm developing a program that use webcam to detect face. I have 2 forms: the Main form and the Camera form.
Main
form is for shows the webcam status (Attached or Detached) with green and red dot picture. I useTimer
to scan for a camera, if webcam is attached the pic will be green and theCamera
form will show, if webcam is detached the pic will be red and theCamera
form will close itself.Camera
form is for shows webcam's feed. If it detects face, the form will draw a square around their face.
The main question is: if the Camera
form is already open and being closed down. The second time it open. The video feed will goes black and the Main
form goes massive lagging. (If I manually close the Camera
form down, it won't have any problem.)
Here's a codes in Main
form for detecting webcam :
private System.Threading.Timer deviceScanner;
private void scanDevices() => deviceScanner = new System.Threading.Timer(checkDevices, null, 0, 1000);
private void checkDevices(object state)
{
hasCamera = checkCamera();
if (hasCamera)
{
Cam_status.Image = Properties.Resources.Aqua_Ball_Green_icon;
if (hasCamera == true && hasCameraForm == false)
{
this.BeginInvoke(new Action(() =>
{
Camera cam = new Camera();
cam.Show();
}));
}
hasCameraForm = true;
}
else if (!hasCamera)
{
Cam_status.Image = Properties.Resources.Aqua_Ball_Red_icon;
//MiscFunc.status_cam = false;
this.BeginInvoke(new MethodInvoker(() =>
{
MiscFunc.closeForm("Camera");
}));
hasCameraForm = false;
}
}
private bool checkCamera()
{
string CamTest = SelectCardModel();
return CamTest.Length > 0;
}
public string cam_name;
public string SelectWebCamModel()
{
try
{
ManagementObjectSearcher searcherAcr = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity Where Name Like '%Logitech%'");
if (searcherAcr.Get().Count == 0)
{
return cam_name = "";
}
foreach (ManagementObject usb in searcherAcr.Get())
{
cam_name = "Logitec";
}
}
catch
{
}
return cam_name;
}
Here's codes in Camera
form :
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace cameraprogram
{
public partial class Camera : Form
{
private Image<Bgr, Byte> currentFrame;
private Capture grabber;
private HaarCascade face;
private HaarCascade eye;
private MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 0.5d, 0.5d);
private Image<Gray, byte> result;
private Image<Gray, byte> gray = null;
private List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>();
private List<string> labels = new List<string>();
private List<string> NamePersons = new List<string>();
private int t;
private void Camera_Load(object sender, EventArgs e)
{
grabber = new Capture();
grabber.QueryFrame();
Application.Idle += FrameGrabber;
}
public Camera()
{
InitializeComponent();
face = new HaarCascade("haarcascade_frontalface_default.xml");
eye = new HaarCascade("haarcascade_eye.xml");
}
private void FrameGrabber(object sender, EventArgs e)
{
NamePersons.Add("");
currentFrame = grabber.QueryFrame().Resize(320, 240, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
gray = currentFrame.Convert<Gray, Byte>();
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
face, 1.2, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20));
foreach (MCvAvgComp f in facesDetected[0])
{
t++;
result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
currentFrame.Draw(f.rect, new Bgr(Color.Red), 2);
Status_camera = true;
}
t = 0;
imageBox1.Image = currentFrame;
}
}
}