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/
  • 相关阅读:
    494 Target Sum 目标和
    493 Reverse Pairs 翻转对
    492 Construct the Rectangle 构建矩形
    491 Increasing Subsequences 递增子序列
    488 Zuma Game 祖玛游戏
    486 Predict the Winner 预测赢家
    485 Max Consecutive Ones 最大连续1的个数
    483 Smallest Good Base
    Django Form组件
    Django Auth组件
  • 原文地址:https://www.cnblogs.com/kiba/p/14428557.html
Copyright © 2011-2022 走看看