前言
本文主要介紹如何使用OpenCV剪切圖形中的人物頭像。
準備工作
首先建立一個Wpf項目——OpenCV_Face_Wpf,這裡版本使用Framework4.7.2。
然後使用Nuget搜尋【Emgu.CV】,如下圖。

這裡的Emgu.CV選擇4.3.0.3890版本,然後安裝Emgu.CV和Emgu.CV.runtime.windows。
然後下載下傳所需檔案haarcascade_frontalface_default.xml。
可以去OpenCV的開源代碼中下載下傳,下載下傳位址:https://github.com/opencv/opencv/tree/master/data/haarcascades。
然後将檔案加入進項目,并修改屬性,讓xml檔案輸出到啟動目錄,如下圖。
使用OPenCV剪切人臉部分
現在,我們進入項目,進行OPenCV的調用。
首先引入命名空間,如下:
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System.Drawing;
using System.Windows.Forms;
然後編寫人臉剪切函數——CutFace。
函數裡,我們先使用CascadeClassifier類讀取haarcascade_frontalface_default.xml檔案,建立人臉檢測的對象。
再使用Mat類來導入圖檔(灰階模式)。
然後再使用人臉檢測的對象的方法——DetectMultiScale進行人臉數量識别。
最後通過Bitmap類把識别出來的人臉進行剪切儲存。
代碼如下:
public void CutFace(string filename)
{
//CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;//使用GPU運算
var face = new CascadeClassifier("haarcascade_frontalface_default.xml");
var mat = new Mat(filename, ImreadModes.Grayscale);//灰階導入圖檔
int minNeighbors = 7;//最小矩陣組,預設3
var size = new System.Drawing.Size(10, 10);//最小頭像大小
var facesDetected = face.DetectMultiScale(mat, 1.1, minNeighbors, size);
//循環把人臉部分切割出來并儲存
int index = 0;
var bitmap = Bitmap.FromFile(filename);
foreach (var item in facesDetected)
{
index++;
var bmpOut = new Bitmap(item.Width, item.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
var g = Graphics.FromImage(bmpOut);
g.DrawImage(bitmap, new System.Drawing.Rectangle(0, 0, item.Width, item.Height),
new System.Drawing.Rectangle(item.X, item.Y, item.Width, item.Height), GraphicsUnit.Pixel);
g.Dispose();
bmpOut.Save($"Face_{index}.png", System.Drawing.Imaging.ImageFormat.Png);
bmpOut.Dispose();
}
bitmap.Dispose();
mat.Dispose();
face.Dispose();
}
然後編寫一個打開檔案的函數,在成功打開檔案後調用CutFace。
public void SelectImg()
{
System.Windows.Forms.OpenFileDialog frm = new System.Windows.Forms.OpenFileDialog();
frm.Filter = "(*.jpg,*.png,*.jpeg,*.bmp)|*.jgp;*.png;*.jpeg;*.bmp|All files(*.*)|*.*";
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
CutFace(frm.FileName);
}
}
現在我們啟動項目,如下圖:
運作結果
點選界面中的打開圖檔,選中帶人臉的圖檔進行測試。
代碼中預設把剪切的圖檔儲存到Debug檔案夾下,我們打開Debug檔案夾,如下圖:
因為我選中的圖檔隻有一個人臉,是以得到一個剪切圖檔——Face_1.png。
原圖與剪切後的圖檔對比如下:
現在,我們換一個人臉多的圖檔,再測試一下。測試圖檔如下。
運作後結果如下:
----------------------------------------------------------------------------------------------------
到此C#使用OpenCV剪切圖形中的人物頭像就已經介紹完了。
代碼已經傳到Github上了,歡迎大家下載下傳。
Github位址: https://github.com/kiba518/OpenCV_Face_Wpf
----------------------------------------------------------------------------------------------------
注:此文章為原創,任何形式的轉載都請聯系作者獲得授權并注明出處!
若您覺得這篇文章還不錯,請點選下方的【推薦】,非常感謝!
https://www.cnblogs.com/kiba/p/14428557.html