测试开源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)
    }

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

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

参考文献:

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

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

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

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

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

相关推荐
一个不正经的林Sir2 分钟前
C#WPF基础介绍/第一个WPF程序
开发语言·c#·wpf
码农君莫笑10 小时前
使用blazor开发信息管理系统的应用场景
数据库·信息可视化·c#·.net·visual studio
可喜~可乐13 小时前
C# WPF开发
microsoft·c#·wpf
666和77717 小时前
C#的单元测试
开发语言·单元测试·c#
小码编匠18 小时前
WPF 星空效果:创建逼真的宇宙背景
后端·c#·.net
向宇it20 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
yngsqq21 小时前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#
TENET信条1 天前
day53 第十一章:图论part04
开发语言·c#·图论
anlog1 天前
C#在自定义事件里传递数据
开发语言·c#·自定义事件
向宇it1 天前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎