0

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 use Timer to scan for a camera, if webcam is attached the pic will be green and the Camera form will show, if webcam is detached the pic will be red and the Camera 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;
        }
    }
}

0 Answers0