close

 

 

 



            // 人臉分析

            /*
             * 使用顯卡處理圖像數據效率會很多,
             * 如果你的設備支持,最好打開,
             * 使用CvInvoke.HaveOpenCLCompatibleGpuDevice能返回是否支持.
             * 配置CvInvoke.UseOpenCL能讓OpenCV 啟用或者停用 GPU運算.
             */
            CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;

            /*
             * 構建級聯分類器對象
             * emgu包裏已經有訓練好的數據了,
             * 文檔名叫做"haarcascade_frontalface_alt.xml",
             * 就是上面添加的文檔之一.
             */
            var face = new CascadeClassifier("haarcascade_frontalface_alt.xml");




            var op = new OpenFileDialog();
            if (op.ShowDialog() == DialogResult.OK)
            {
                var img = new Image(op.FileName);
                var img2 = new Image(img.ToBitmap());

                // 把圖片從彩色轉成灰度
                CvInvoke.CvtColor(img, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
                // 亮度增強
                CvInvoke.EqualizeHist(img2, img2);
                imageBox1.Image = img;
                imageBox2.Image = img2;


                // 檢測人臉
                /*其實這一步反而最簡單,
                 * 返回的是rectangle[]格式,
                 * 因為圖中可能有多個人臉,
                 * 所以返回的是數組.
                 */
                var facesDetected = face.DetectMultiScale(img2, 1.1, 10, new Size(50, 50));

                //剪切並保存
                /*
                 * 因為是多個人臉所以需要循環剪切並保存
                 */
                int count = 0;
                var b = img.ToBitmap();
                foreach(var item in facesDetected)
                {
                    count++;
                    var bmpOut = new Bitmap(item.Width, item.Height,System.Drawing.Imaging.PixelFormat.Format24bppRgb);

                    var g = Graphics.FromImage(bmpOut);
                    g.DrawImage(b, new Rectangle(0, 0, item.Width, item.Height),
                        new Rectangle(item.X, item.Y, item.Width, item.Height), GraphicsUnit.Pixel);
                    g.Dispose();

                    string strFileName = count.ToString();
                    strFileName += ".png";
                    bmpOut.Save(strFileName, System.Drawing.Imaging.ImageFormat.Png);
                   bmpOut.Dispose();
                }

                // release resource
                b.Dispose();
                img.Dispose();
                img2.Dispose();
                face.Dispose();

            }

 

 

 

 

 

 

arrow
arrow
    全站熱搜

    Eric 發表在 痞客邦 留言(0) 人氣()