zoukankan      html  css  js  c++  java
  • 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_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

     

    https://www.cnblogs.com/kiba/
  • 相关阅读:
    JVM参数默认值列表
    垃圾回收G1日志解析
    《深入理解JAVA虚拟机》垃圾回收时为什么会停顿
    《深入理解JAVA虚拟机》JDK的垃圾收集算法
    什么才是技术?
    Lodash使用示例(比较全)
    MSCL超级工具类(C#),开发人员必备,开发利器
    刷新SqlServer数据库中所有的视图
    Sql Server 2014/2012/2008/2005 数据库还原出现 3154错误的解决办法
    C#中执行批处理文件(.bat),执行数据库相关操作
  • 原文地址:https://www.cnblogs.com/kiba/p/14428557.html
Copyright © 2011-2022 走看看