当前位置: 首页 > news >正文

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

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

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函数用指定图片填充人脸区域,关键代码如下:

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

http://www.lryc.cn/news/306400.html

相关文章:

  • 2.21 Qt day2 菜单栏/工具栏/状态栏/浮动窗口、UI界面、信号与槽
  • 300分钟吃透分布式缓存-16讲:常用的缓存组件Redis是如何运行的?
  • 上一篇文章补充:已经存在的小文件合并
  • 代码随想录训练营第三十期|第四十三天|动态规划 part05|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
  • c++学习记录 string容器—字符串插入和删除
  • 【IEEE会议征稿】2024年第九届智能计算与信号处理国际学术会议(ICSP 2024)
  • 【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制
  • Java学习——集合框架
  • 【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期
  • jdk动态代理与CGLib动态代理
  • Linux 命令行的世界 :4.操作文件和目录
  • 如何使用ArcGIS Pro生成等高线
  • golang学习2,golang开发配置国内镜像
  • Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)
  • 前端笔记——var let const 之间的区别
  • AI工具新革命:从ChatGPT到Sora,生成式AI改变世界
  • C 标准库 - <stdio.h> 详解
  • 支付宝小程序中唤起支付(前后端)
  • AI:139-基于深度学习的语音指令识别与执行
  • 选择 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)
  • Rabbitmq 超时异常解决:PRECONDITION_FAILED - Timeout value used: 1800000 ms.
  • Java架构师之路二、数据库:SQL语言、关系型数据库、非关系型数据库、数据一致性、事务管理等。
  • 【Spring Cloud】高并发带来的问题及常见容错方案
  • springAOP落地实现
  • Linux学习之vi/vim详细介绍
  • 【AIGC大模型】跑通wonder3D (windows)
  • Opencv(2)深浅拷贝与基本绘图(c++python
  • 二叉树与堆
  • 神经网络系列---损失函数
  • LeetCode每日一题 有效的字母异位词(哈希表)