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();
}
全站熱搜
留言列表