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

相关推荐
我是唐青枫17 小时前
C#.NET ValueTaskSource 深入解析:零分配异步、ManualResetValueTaskSourceCore 与使用边界
c#·.net
iCxhust17 小时前
C#程序,窗体1向窗体2的textbox控件写入字符串“hello”
开发语言·c#
iCxhust18 小时前
C#如何实现textbox文本多行输出 且自动换行输出
开发语言·c#
政沅同学21 小时前
C# 一种很好用的设计模式 不同对象之间进行解耦通信
设计模式·c#
咩图1 天前
C#进程通讯-命名管道通讯
c#·命名管道·进程通讯
SunnyDays10111 天前
如何使用 C# 高效实现 Excel 与 CSV 的互相转换
c#·excel·csv
Byron Loong1 天前
【网络】C#TCP 通讯
网络·tcp/ip·c#
geovindu1 天前
密码进行加盐哈希 using CSharp,Python,Go,Java
java·python·golang·c#·哈希算法
傻啦嘿哟1 天前
Python 操作 Word 文档属性与字数统计方法详解
开发语言·c#
.NET修仙日记1 天前
2026 .NET 面试八股文:高频题 + 答案 + 原理(基础核心篇)
云原生·面试·职场和发展·c#·.net·面试题·微软技术