コード例 #1
0
        /// <summary>
        /// 透過OpenCV進行人臉是否存在的辨識
        /// </summary>
        /// <param name="objMat"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private OpenCVResult CaptureFace(Mat objMat)
        {
            long             detectionTime;
            List <Rectangle> faces = new List <Rectangle>();
            List <Rectangle> eyes  = new List <Rectangle>();

            DetectFace.Detect(
                objMat, "haarcascade_frontalface_default.xml", "haarcascade_eye.xml",
                faces, eyes,
                out detectionTime);

            // 重新計算比例
            decimal diWidth  = decimal.Parse(picRender.Width.ToString()) / decimal.Parse(objMat.Bitmap.Width.ToString());
            decimal diHeight = decimal.Parse(picRender.Height.ToString()) / decimal.Parse(objMat.Bitmap.Height.ToString());

            List <Rectangle> objDraw = new List <Rectangle>();

            for (int i = 0; i < faces.Count; i++)
            {
                objDraw.Add(new Rectangle(
                                (int)(faces[i].X * diWidth),
                                (int)(faces[i].Y * diHeight),
                                (int)(faces[i].Width * diWidth),
                                (int)(faces[i].Height * diHeight)
                                ));
            }

            OpenCVResult result = new OpenCVResult()
            {
                eyes  = eyes,
                faces = faces,
            };

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// 使用固定秒數後,取得Cam的影像圖片,並使用圖片進行人臉辨識
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            using (Mat objMat = new Mat())
            {
                #region // 使用本地端Cam
                objVideoCapture = new VideoCapture(0);
                objVideoCapture.Retrieve(objMat);
                #endregion

                #region // 使用IPCam
                //System.Net.WebRequest request = System.Net.WebRequest.Create("http://192.168.100.16/image/jpeg.cgi");
                //request.Credentials = new System.Net.NetworkCredential("facedetect", "facedetect");
                //System.Net.WebResponse response = request.GetResponse();
                //System.IO.Stream responseStream = response.GetResponseStream();
                //Bitmap bitmap2 = new Bitmap(responseStream);
                //Image<Bgr, Byte> imageCV = new Image<Bgr, byte>(bitmap2); //Image Class from Emgu.CV
                //objMat = imageCV.Mat;
                #endregion

                if (objMat.Bitmap != null)
                {
                    OpenCVResult result = this.CaptureFace(objMat);

                    // 在影像上進行框線的繪圖
                    for (int f = 0; f < result.faces.Count; f++)
                    {
                        CvInvoke.Rectangle(objMat, result.faces[f], new Bgr(Color.Red).MCvScalar, 2);
                    }

                    for (int y = 0; y < result.eyes.Count; y++)
                    {
                        CvInvoke.Rectangle(objMat, result.eyes[y], new Bgr(Color.Yellow).MCvScalar, 1);
                    }

                    // 將圖片放到PictureBox之中
                    if (picRender.Image != null)
                    {
                        picRender.Image.Dispose();
                    }

                    IntPtr gdibitmap = objMat.Bitmap.GetHbitmap();
                    picRender.Image = Image.FromHbitmap(gdibitmap);
                    DeleteObject(gdibitmap);
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// 處理影格的動作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ProcessFrameAsync(object sender, EventArgs e)
        {
            try
            {
                using (Mat objMat = new Mat())
                {
                    // 從OpenCV取得影像,並辨識人臉的存在
                    objVideoCapture.Retrieve(objMat);
                    OpenCVResult result = this.CaptureFace(objMat);

                    // 在影像上進行框線的繪圖
                    for (int f = 0; f < result.faces.Count; f++)
                    {
                        CvInvoke.Rectangle(objMat, result.faces[f], new Bgr(Color.Red).MCvScalar, 2);
                    }

                    for (int y = 0; y < result.eyes.Count; y++)
                    {
                        CvInvoke.Rectangle(objMat, result.eyes[y], new Bgr(Color.Yellow).MCvScalar, 1);
                    }

                    // 將圖片放到PictureBox之中
                    if (picRender.Image != null)
                    {
                        picRender.Image.Dispose();
                    }

                    IntPtr gdibitmap = objMat.Bitmap.GetHbitmap();
                    picRender.Image = Image.FromHbitmap(gdibitmap);
                    DeleteObject(gdibitmap);

                    Thread.Sleep(5);
                }
            }
            catch (Exception ex)
            {
                string strMsg = ex.Message;
                txtMessage.Text = strMsg;
            }
        }