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

相关推荐
土了个豆子的14 小时前
03.缓存池
开发语言·前端·缓存·visualstudio·c#
xiaowu0801 天前
策略模式-不同的鸭子的案例
开发语言·c#·策略模式
VisionPowerful1 天前
九.弗洛伊德(Floyd)算法
算法·c#
ArabySide1 天前
【C#】 资源共享和实例管理:静态类,Lazy<T>单例模式,IOC容器Singleton我们该如何选
单例模式·c#·.net core
gc_22992 天前
C#测试调用OpenXml操作word文档的基本用法
c#·word·openxml
almighty272 天前
C#海康车牌识别实战指南带源码
c#·海康车牌识别·c#实现车牌识别·车牌识别源码·c#车牌识别
c#上位机2 天前
wpf之TextBlock
c#·wpf
almighty272 天前
C# WinForm分页控件实现与使用详解
c#·winform·分页控件·c#分页·winform分页
almighty272 天前
C#实现导入CSV数据到List<T>的完整教程
c#·csv·格式转换·c#导入数据·csv数据导入
程序猿多布2 天前
Lua和C#比较
c#·lua