锦绣坊 發表於 2021-2-22 09:54:00

C#使用OpenCV剪切图片中的人物头像

<p style="width: 100%; background: rgba(65, 105, 225, 1); color: rgba(255, 255, 255, 1); height: 50px; font-size: 30px; line-height: 50px">前言</p>
<p class="md-end-block md-p"><span class="md-plain">本文主要介绍如何使用OpenCV剪切图形中的人物头像。</span></p>
<p style="width: 100%; background: rgba(65, 105, 225, 1); color: rgba(255, 255, 255, 1); height: 50px; font-size: 30px; line-height: 50px">准备工作</p>
<p class="md-end-block md-p"><span class="md-plain">首先创建一个Wpf项目——OpenCV_Face_Wpf,这里版本使用Framework4.7.2。</span></p>
<p class="md-end-block md-p"><span class="md-plain">然后使用Nuget搜索【Emgu.CV】,如下图。</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/243596/202102/243596-20210222094814627-1391242139.png" alt="" loading="lazy"></p>
<p class="md-end-block md-p"><span class="md-plain">这里的Emgu.CV选择4.3.0.3890版本,然后安装Emgu.CV和Emgu.CV.runtime.windows。</span></p>
<p class="md-end-block md-p"><span class="md-plain">然后下载所需文件haarcascade_frontalface_default.xml。</span></p>
<p class="md-end-block md-p"><span class="md-plain">可以去OpenCV的开源代码中下载,下载地址:<span class="md-link">https://github.com/opencv/opencv/tree/master/data/haarcascades<span class="md-plain">。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">然后将文件加入进项目,并修改属性,让xml文件输出到启动目录,如下图。</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/243596/202102/243596-20210222094830102-1244574788.png" alt="" loading="lazy"></p>
<p style="width: 100%; background: rgba(65, 105, 225, 1); color: rgba(255, 255, 255, 1); height: 50px; font-size: 30px; line-height: 50px">使用OPenCV剪切人脸部分</p>
<p class="md-end-block md-p"><span class="md-plain">现在,我们进入项目,进行OPenCV的调用。</span></p>
<p class="md-end-block md-p"><span class="md-plain">首先引入命名空间,如下:</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System.Drawing;
using System.Windows.Forms;</pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">然后编写人脸剪切函数——CutFace。</span></p>
<p class="md-end-block md-p"><span class="md-plain">函数里,我们先使用CascadeClassifier类读取haarcascade_frontalface_default.xml文件,建立人脸检测的对象。</span></p>
<p class="md-end-block md-p"><span class="md-plain">再使用Mat类来导入图片(灰度模式)。</span></p>
<p class="md-end-block md-p"><span class="md-plain">然后再使用人脸检测的对象的方法——DetectMultiScale进行人脸数量识别。</span></p>
<p class="md-end-block md-p"><span class="md-plain">最后通过Bitmap类把识别出来的人脸进行剪切保存。</span></p>
<p class="md-end-block md-p"><span class="md-plain">代码如下:</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">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();
}</pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">然后编写一个打开文件的函数,在成功打开文件后调用CutFace。</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">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);
    }
}</pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">现在我们启动项目,如下图:</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/243596/202102/243596-20210222094922893-1447408028.png" alt="" loading="lazy"></p>
<p style="width: 100%; background: rgba(65, 105, 225, 1); color: rgba(255, 255, 255, 1); height: 50px; font-size: 30px; line-height: 50px">运行结果</p>
<p class="md-end-block md-p"><span class="md-plain">点击界面中的打开图片,选中带人脸的图片进行测试。</span></p>
<p class="md-end-block md-p"><span class="md-plain">代码中默认把剪切的图片保存到Debug文件夹下,我们打开Debug文件夹,如下图:</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/243596/202102/243596-20210222094938429-1467993251.png" alt="" loading="lazy"></p>
<p class="md-end-block md-p"><span class="md-plain">因为我选中的图片只有一个人脸,所以得到一个剪切图片——Face_1.png。</span></p>
<p class="md-end-block md-p"><span class="md-plain">原图与剪切后的图片对比如下:</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/243596/202102/243596-20210224095835645-2105381195.png" alt="" loading="lazy"></p>
<p class="md-end-block md-p"><span class="md-plain">现在,我们换一个人脸多的图片,再测试一下。测试图片如下。</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/243596/202102/243596-20210222095010417-128973199.png" alt="" loading="lazy"></p>
<p class="md-end-block md-p"><span class="md-plain">运行后结果如下:</span></p>
<p class="md-end-block md-p"><img src="https://img2020.cnblogs.com/blog/243596/202102/243596-20210222095025204-1733130303.png" alt="" loading="lazy"></p>
<p>----------------------------------------------------------------------------------------------------</p>
<p class="md-end-block md-p"><span class="md-plain">到此C#使用OpenCV剪切图形中的人物头像就已经介绍完了。</span></p>
<p>代码已经传到Github上了,欢迎大家下载。</p>
<p style="border: 2px solid rgba(115, 191, 0, 1); padding: 10px 40px; background: rgba(204, 255, 128, 1); border-radius: 15px; -moz-border-radius: 15px">Github地址:&nbsp;https://github.com/kiba518/OpenCV_Face_Wpf</p>
<p>----------------------------------------------------------------------------------------------------</p>
<p>注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!<br>若您觉得这篇文章还不错,请点击下方的<span style="color: rgba(255, 0, 0, 1)">【<strong>推荐】</strong></span>,非常感谢!</p>
<p>https://www.cnblogs.com/kiba/p/14428557.html</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/243596/201909/243596-20190904083750507-629449790.png" alt=""></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    https://www.cnblogs.com/kiba/<br><br>
来源:https://www.cnblogs.com/kiba/p/14428557.html
頁: [1]
查看完整版本: C#使用OpenCV剪切图片中的人物头像