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

相关推荐
mudtools1 小时前
解放双手!使用Roslyn生成代码让你的 HTTP 客户端开发变得如此简单
低代码·c#·.net
张人玉4 小时前
WPF 数据绑定与转换器详解
c#·wpf·light
主宰者4 小时前
WPF CalcBinding简化判断逻辑
c#·.net·wpf
就是有点傻14 小时前
使用PaddleOCRSharp大模型精选文字识别
c#
LeonDL16815 小时前
【通用视觉框架】基于C#+Winform+OpencvSharp开发的视觉框架软件,全套源码,开箱即用
人工智能·c#·winform·opencvsharp·机器视觉软件框架·通用视觉框架·机器视觉框架
数据的世界0116 小时前
技术变革:为何C#与.NET是未来的开发方向
java·c#·.net
大龄Python青年16 小时前
C#快入教程:Linux安装.NET
linux·c#·.net
我是唐青枫17 小时前
C#.NET Random 深入解析:随机数生成原理与最佳实践
c#·.net
光头闪亮亮17 小时前
电子发票解析工具-c#桌面应用开发案例详解
c#
咕白m62519 小时前
如何通过 C# 提取 PDF 图片?单页与全文档提取
c#·.net