测试C#使用ViewFaceCore实现图片中的人脸遮挡

基于ViewFaceCore和DlibDotNet都能实现人脸识别,准备做个遮挡图片中人脸的程序,由于暂时不清楚DlibDotNet返回的人脸尺寸与像素的转换关系,最终决定使用ViewFaceCore实现图片中的人脸遮挡。
  新建Winform项目,在Nuget包管理器中搜索并安装ViewFaceCore,实现人脸遮挡主要分两个步骤:
  1)检测人脸 :调用ViewFaceCore模块的FaceDetector类识别人脸位置信息;
  2)人脸遮挡 :调用GDI+的相关函数实现人脸遮挡,主要包括以下三种挡方式:
    a)纯色填充,此种方式主要调用Graphics.FillRectangle函数用指定颜色填充人脸区域,关键代码如下:

csharp 复制代码
using (SolidBrush sb = new SolidBrush(selectColor))
{
    for (int i = 0; i < faces.Count; i++)
    {
        e.Graphics.FillRectangle(sb,
            startX + faces[i].Face.Location.X * scale,
            startY + faces[i].Face.Location.Y * scale,
            faces[i].Face.Location.Width * scale,
            faces[i].Face.Location.Height * scale);
    }
}

b)图片填充,此种方式主要调用Graphics.DrawImage函数用指定图片填充人脸区域,关键代码如下:

csharp 复制代码
for (int i = 0; i < m_faces.Count; i++)
{
    e.Graphics.DrawImage(picMaskImage.Image,
        startX + faces[i].Face.Location.X * scale,
        startY + faces[i].Face.Location.Y * scale,
        faces[i].Face.Location.Width * scale,
        faces[i].Face.Location.Height * scale);
}

c)马赛克效果填充 ,此种方式是人脸区域实现马赛克效果,与前两种方式不同之处在于,前两种方式可以不用直接操作图片,可以在panel控件中先绘制图片,再根据图片起始位置和当前缩放比例计算人脸在控件中的相对位置后再控件中填充颜色或图片,而马赛克效果需要操作图片中的像素,不便于直接在控件中操作,而是在图片中实现马赛克效果后仅在控件中显示最终图片效果。
  网上分析和实现马赛克效果的文章很多,本文采用参考文献1中的代码,并微调其中的马赛克实现函数(原文的函数将整个图片处理为马赛克,本文使用是改成了将图片指定矩形区域处理为马赛克)
  最后是程序运行效果:原始图形如下:

  纯色填充效果如下:

  采用图片填充效果如下:

  马赛克填充效果如下:

测试代码放在GitHub,地址为:https://github.com/guochao2299/TestFaceMask

参考文献:

1\]https://blog.csdn.net/yinsefeixingchuan/article/details/123435426

相关推荐
爱吃奶酪的松鼠丶1 小时前
.net GRPC服务搭建,跨进程调用。C#应用和Python应用之间的通信。
python·c#·.net
勘察加熊人6 小时前
forms实现俄罗斯方块
c#
艾妮艾妮10 小时前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
小码编匠10 小时前
.NET 验证码生成神器基于 SkiaSharp 的高性能方案
后端·c#·.net
专注VB编程开发20年11 小时前
Aspose.words,Aspose.cells,vb.net,c#加载许可证,生成操作选择:嵌入的资源
c#·word·.net·vb.net
andy552011 小时前
.NET 使用 WMQ 连接Queue 发送 message 实例
xml·c#·wmq·c# 连接wmq·发送消息到wmq
破罐子不摔11 小时前
【C#使用S7.NET库读取和写入西门子PLC变量】
java·c#·.net
杰尼杰尼丶11 小时前
Winform MQTT客户端连接方式
c#·winform
weixin_3077791312 小时前
C#实现HiveQL建表语句中特殊数据类型的包裹
开发语言·数据仓库·hive·c#
lixy57912 小时前
C# WPF 命令机制(关闭CanExecute自动触发,改手动)
c#·wpf