• 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/
  • 相关阅读:
    atitit.js浏览器环境下的全局异常捕获
    atitit.事件驱动的总结attilax
    atitit.事件驱动的总结attilax
    1.1.1. Atitit Cocos2d-JS v3.x的问题
    1.1.1. Atitit Cocos2d-JS v3.x的问题
    Atitit html5 Canvas 如何自适应屏幕大小
    Atitit  如何让精灵控件运动
    Atitit html5 Canvas 如何自适应屏幕大小
    Atitit  如何让精灵控件运动
    atitit.日期,星期,时候的显示方法ISO 8601标准
  • 原文地址:https://www.cnblogs.com/kiba/p/14428557.html
Copyright © 2020-2023  润新知