C# 搭配 OpenCV 快速实现图片人脸识别与保存

120 阅读3分钟

前言

计算机视觉领域,人脸识别是一项常见且重要的任务。C#+OpenCV可以方便地实现这一功能,本文将详细介绍如何使用C#和OpenCV在一张图片里寻找人脸,包括相关库的下载、工程建立、代码编写等步骤。

相关库的下载

例程中使用的库是emgucv,它是OpenCV的.NET封装。

编译打包好的稳定版可在此处获取:sourceforge.net/projects/em…

若要获取最新代码,可在此处获取:github.com/emgucv/emgu…

建立工程

1、创建工程:首先建立一个C#控制台工程。

2、添加引用:添加引用Emgu.CV.World.dll

3、添加文件:将haarcascade_frontalface_alt.xml文件添加到工程中(在emgucv的压缩包里,需根据编译程序是32位还是64位选择不同的dll文件,并将"复制到输出目录"设为"较新则复制")。

4、准备图片:准备一张要识别的图片,放到编译输出目录。

代码实现

1、配置OpenCV使用显卡运算(如果支持的话)

使用显卡处理图像数据效率会提高很多,如果设备支持,最好打开。使用CvInvoke.HaveOpenCLCompatibleGpuDevice能返回是否支持,配置CvInvoke.UseOpenCL能让OpenCV启用或者停用GPU运算。

CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;

2、构建级联分类器对象

emgu包里已经有训练好的数据,文件名叫做haarcascade_frontalface_alt.xml

var face = new CascadeClassifier("haarcascade_frontalface_alt.xml");

3、加载图像并作简单处理

在OpenCV中,大部分函数处理灰度图,包括识别物体,所以需要将图片转成灰度图,然后再调整下亮度。

//加载要识别的图片
var img = new Image<Bgr, byte>("0.png");
var img2 = new Image<Gray, byte>(img.ToBitmap());
//把图片从彩色转灰度
CvInvoke.CvtColor(img, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
//亮度增强
CvInvoke.EqualizeHist(img2, img2);

4、检测人脸

这一步返回的是rectangle[]格式,因为图中可能有多个人脸,所以返回的是数组。

//在这一步就已经识别出来了,返回的是人脸所在的位置和大小
var facesDetected = face.DetectMultiScale(img2, 1.1, 10, new Size(50, 50));

5、剪切并保存

因为是多个人脸所以需要循环剪切并保存。

//循环把人脸部分切出来并保存
int count = 0;
var b = img.ToBitmap();
foreach (var item in facesDetected)
{
    count++;
    var bmpOut = new Bitmap(item.Width, item.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    var g = Graphics.FromImage(bmpOut);
    g.DrawImage(b, new Rectangle(0, 0, item.Width, item.Height), new Rectangle(item.X, item.Y, item.Width, item.Height), GraphicsUnit.Pixel);
    g.Dispose();
    bmpOut.Save($"{count}.png", System.Drawing.Imaging.ImageFormat.Png);
    bmpOut.Dispose();
}

6、释放资源退出

//释放资源退出
b.Dispose();
img.Dispose();
img2.Dispose();
face.Dispose();

7、完整代码

static void Main(string[] args)
{
    //如果支持用显卡,则用显卡运算
    CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;

    //构建级联分类器,利用已经训练好的数据,识别人脸
    var face = new CascadeClassifier("haarcascade_frontalface_alt.xml");

    //加载要识别的图片
    var img = new Image<Bgr, byte>("0.png");
    var img2 = new Image<Gray, byte>(img.ToBitmap());

    //把图片从彩色转灰度
    CvInvoke.CvtColor(img, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);

    //亮度增强
    CvInvoke.EqualizeHist(img2, img2);

    //在这一步就已经识别出来了,返回的是人脸所在的位置和大小
    var facesDetected = face.DetectMultiScale(img2, 1.1, 10, new Size(50, 50));

    //循环把人脸部分切出来并保存
    int count = 0;
    var b = img.ToBitmap();
    foreach (var item in facesDetected)
    {
        count++;
        var bmpOut = new Bitmap(item.Width, item.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        var g = Graphics.FromImage(bmpOut);
        g.DrawImage(b, new Rectangle(0, 0, item.Width, item.Height), new Rectangle(item.X, item.Y, item.Width, item.Height), GraphicsUnit.Pixel);
        g.Dispose();
        bmpOut.Save($"{count}.png", System.Drawing.Imaging.ImageFormat.Png);
        bmpOut.Dispose();
    }

    //释放资源退出
    b.Dispose();
    img.Dispose();
    img2.Dispose();
    face.Dispose();

    return;
}

总结

通过以上步骤,我们可以在C#中使用OpenCV实现从一张图片中寻找人脸并保存的功能。首先下载相关库,建立工程并添加必要的引用和文件,然后编写代码配置显卡运算、构建级联分类器、加载和处理图像、检测人脸、剪切并保存人脸部分,最后释放资源。运行程序后,可以在编译输出目录中看到识别出的人脸图片。

关键词

C#、OpenCV、人脸识别、emgucv、级联分类器、C#、OpenCV、EmguCV、人脸识别、图像处理、Haar级联、GPU加速、计算机视觉、.NET、图像剪切

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:asml

出处:cnblogs.com/DragonStart/p/7751993.html

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!