C#使⽤OpenCV 剪切图⽚中的⼈物头像
前⾔
本⽂主要介绍如何使⽤OpenCV剪切图形中的⼈物头像。
准备⼯作
⾸先创建⼀个Wpf项⽬——OpenCV_Face_Wpf,这⾥版本使⽤Framework4.7.2。
然后使⽤Nuget搜索【Emgu.CV】,如下图。
这⾥的Emgu.CV选择4.3.0.3890版本,然后安装Emgu.CV和Emgu.CV.runtime.windows。然后下载所需⽂件haarcascade_l。
然后将⽂件加⼊进项⽬,并修改属性,让xml⽂件输出到启动⽬录,如下图。
使⽤OPenCV剪切⼈脸部分
现在,我们进⼊项⽬,进⾏OPenCV的调⽤。
⾸先引⼊命名空间,如下:
1
2
3
4
5using Emgu.CV;using Emgu.CV.CvEnum;using Emgu.CV.Structure;using System.Drawing;using System.Windows.Forms;
然后编写⼈脸剪切函数——CutFace。
函数⾥,我们先使⽤CascadeClassifier类读取haarcascade_l⽂件,建⽴⼈脸检测的对象。再使⽤Mat类来导⼊图⽚(灰度模式)。
然后再使⽤⼈脸检测的对象的⽅法——DetectMultiScale进⾏⼈脸数量识别。
最后通过Bitmap类把识别出来的⼈脸进⾏剪切保存。
代码如下:
123456
public void CutFace(string filename)
{
//CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;//使⽤GPU 运算
var face = new CascadeClassifier("haarcascade_l");
var mat = new Mat(filename, ImreadModes.Grayscale);//灰度导⼊图⽚
int minNeighbors = 7;//最⼩矩阵组,默认3
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 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();
}
rectangle函数opencv然后编写⼀个打开⽂件的函数,在成功打开⽂件后调⽤CutFace。
1 2 3 4 5 6 7 8 9public 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上了,欢迎⼤家下载。
----------------------------------------------------------------------------------------------------
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论