测试开源C#人脸识别模块DlibDotNet

  百度"C# 换脸"找到参考文献4,发现其中使用DlibDotNet检测并识别人脸(之前主要用的是ViewFaceCore),DlibDotNet是Dlib的.net封装版本,后者为开源C++工具包,支持机器学习算法、图像处理等算法以支撑各类高级应用,本文学习使用DlibDotNet识别人脸的基本方式,为后续学习和验证换脸打基础。
  VS2022中新建Winform项目,然后在Nuget包管理器中搜索并安装DlibDotNet相关包,根据参考文献1-3中的说明及示例,安装了DlibDotNet和DlibDotNet.Extensions

  安装上述包进行人脸检测没有问题,但是在程人脸检测后调用相关函数在图片中绘制人脸区域方框后转成微软的Bitmap类型对象时(调用DlibDotNet.Extensions.BitmapExtensions的扩展函数ToBitmap)始终存在问题。如果安装同时安装了DlibDotNet和DlibDotNet.Extensions,则编译不通过,会提示下图所示二义性错误,从GitHub上的源码中看,在DlibDotNet.Extensions项目中已经没有BitmapExtensions相关的文件了,不清楚为什么会报二义性错误,最终将DlibDotNet.Extensions卸载,仅安装DlibDotNet包,即可解决该问题。

  仅安装DlibDotNet包的话,编译不会出错,但在程序运行到ToBitmap函数时会提示NotSupportedException异常 ,后面翻ToBitmap的源码发现是使用的图像数据类型不对,将图像数据类型从Array2D修改为Array2D即可,主要支持RgbPixel、BgrPixel和RgbAlphaPixel这三种类型,其它类型的都会抛异常。
  人脸识别的关键代码如下所示,这里与测试ViewFaceCore的不同之处在于,ViewFaceCore返回的人脸位置信息是基于像素,可以直接调用微软的GDI+函数在窗口控件中先绘制图片再绘制人脸矩形,而detector.Operator函数返回的尺寸,暂时不清楚单位是什么,只能调用Dlib类中的相关函数将人脸矩形绘制到图片中,再将图片显示到窗口中。

csharp 复制代码
using (var detector = Dlib.GetFrontalFaceDetector())
{
    using (Array2D<RgbPixel> img = Dlib.LoadImage<RgbPixel>(pnlImage.Tag.ToString()))
    {
        Dlib.PyramidUp(img);

        var dets = detector.Operator(img);
        txtResult.Text = String.Empty;
        txtResult.Text = $"识别到的人脸数量:{dets.Length} 个人脸信息:\n";

        foreach (var r in dets)
        {
            Dlib.DrawRectangle(img, r, new RgbPixel(255, 0, 0));
        }
        m_image = img.ToBitmap<RgbPixel>();//或者调用BitmapExtensions.ToBitmap(img)
    }

  测试过程中还遇到图片文件路径不能有中文,否则也会报错,暂不清楚是否是未设置编码造成的,将文件路径中的中文消除后即可正常加载图片。

  最后是程序运行效果,如下图所示:

参考文献:

1https://github.com/takuya-takeuchi/DlibDotNet

2https://github.com/takuya-takeuchi/FaceRecognitionDotNet

3https://github.com/takuya-takeuchi/DlibDotNet/tree/master/examples/FaceDetection

4https://blog.csdn.net/lw112190/article/details/131791878

5https://blog.csdn.net/Raink_LH/article/details/102831453

相关推荐
吾与谁归in2 小时前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
昂好的day3 小时前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
吃一碗粉只付一碗钱20 小时前
10-令牌里的用户主键不要明文
服务器·数据库·sql·sqlserver·c#
胖纸不争1 天前
EnergyStarZ:让 Windows 后台进程给前台让路的能效管理器(v1.2 发布)
windows·性能优化·c#·win32·ef core
曹牧1 天前
C#:The operation has timed out
开发语言·c#
He BianGu1 天前
【WPF-Control教程】IOC 依赖注入
c#·wpf·wpf-control
He BianGu1 天前
【WPF-Control教程】H.Extensions.Behvaiors 开发文档
c#·wpf·wpf-control
He BianGu1 天前
【WPF-Control教程】H.Style 开发文档
c#·wpf·wpf-control
He BianGu1 天前
【WPF-Control教程】MVVM 二次开发文档
c#·wpf·wpf-control