C# 人脸检测 人脸比对 活体检测 口罩检测 年龄预测 性别预测 眼睛状态检测
基于以下开源软件做了一个Demo
GitHub - ViewFaceCore/ViewFaceCore: C# 超简单的离线人脸识别库。( 基于 SeetaFace6 )
效果


代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ViewFaceCore.Core;
using ViewFaceCore.Model;
using System.Drawing;
using System.Diagnostics;
namespace ViewFaceCoreDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
private void btnSelect_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = fileFilter;
if (ofd.ShowDialog() != DialogResult.OK) return;
pictureBox1.ImageLocation = ofd.FileName;
}
private void button5_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = fileFilter;
if (ofd.ShowDialog() != DialogResult.OK) return;
pictureBox2.ImageLocation = ofd.FileName;
}
/// <summary>
/// 人脸检测
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string msg = "";
if (pictureBox1.Image == null)
{
msg = "图片1不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
FaceDetector faceDetector = new FaceDetector();
Bitmap bitmap = new Bitmap(pictureBox1.Image);
FaceImage faceImage = bitmap.ToFaceImage();
FaceInfo[] infos = faceDetector.Detect(faceImage);
if (infos.Length == 0)
{
msg = "图片1未检测到人脸";
richTextBox1.Text += msg + "\r\n";
return;
}
//Console.WriteLine("识别到的人脸数量:" + infos.Length + " 个人脸信息:\n");
//Console.WriteLine("No.\t人脸置信度\t位置信息");
//for (int i = 0; i < infos.Length; i++)
//{
// Console.WriteLine(String.Format("{0}\t{1}\t{2}", i, infos[i].Score, infos[i].Location));
//}
//画方框,标记人脸
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawRectangles(new Pen(Color.Red, 2), infos.Select(p => new RectangleF(p.Location.X, p.Location.Y, p.Location.Width, p.Location.Height)).ToArray());
}
pictureBox1.Image = bitmap;
}
/// <summary>
/// 活体检测
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
string msg = "";
if (pictureBox1.Image == null)
{
msg = "图片1不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
FaceImage bitmap = new Bitmap(pictureBox1.Image).ToFaceImage();
FaceDetector faceDetector = new FaceDetector();
FaceLandmarker faceMark = new FaceLandmarker();
FaceAntiSpoofing faceAntiSpoofing = new FaceAntiSpoofing();
if (faceDetector.Detect(bitmap).Length == 0)
{
msg = "图片1未检测到人脸";
richTextBox1.Text += msg + "\r\n";
return;
}
var info = faceDetector.Detect(bitmap).First();
var markPoints = faceMark.Mark(bitmap, info);
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
var result = faceAntiSpoofing.AntiSpoofing(bitmap, info, markPoints);
msg = "活体检测,结果:" + result.Status + ",清晰度:" + result.Clarity + ",真实度:" + result.Reality + ",耗时:" + sw.ElapsedMilliseconds + "ms";
richTextBox1.Text += msg + "\r\n";
Console.WriteLine(msg);
sw.Stop();
}
/// <summary>
/// 人脸比对
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
String msg = "";
if (pictureBox1.Image == null)
{
msg = "图片1不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
if (pictureBox2.Image == null)
{
msg = "图片2不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
var faceImage0 = new Bitmap(pictureBox1.Image).ToFaceImage();
var faceImage1 = new Bitmap(pictureBox2.Image).ToFaceImage();
//检测人脸信息
FaceDetector faceDetector = new FaceDetector();
FaceInfo[] infos0 = faceDetector.Detect(faceImage0);
FaceInfo[] infos1 = faceDetector.Detect(faceImage1);
if (infos0.Length == 0)
{
msg = "图片1未检测到人脸";
richTextBox1.Text += msg + "\r\n";
sw.Stop();
return;
}
if (infos1.Length == 0)
{
msg = "图片2未检测到人脸";
richTextBox1.Text += msg + "\r\n";
sw.Stop();
return;
}
//标记人脸位置
FaceLandmarker faceMark = new FaceLandmarker();
FaceMarkPoint[] points0 = faceMark.Mark(faceImage0, infos0[0]);
FaceMarkPoint[] points1 = faceMark.Mark(faceImage1, infos1[0]);
//提取特征值
FaceRecognizer faceRecognizer = new FaceRecognizer();
float[] data0 = faceRecognizer.Extract(faceImage0, points0);
float[] data1 = faceRecognizer.Extract(faceImage1, points1);
//对比特征值
bool isSelf = faceRecognizer.IsSelf(data0, data1);
//计算相似度
float similarity = faceRecognizer.Compare(data0, data1);
msg = "识别到的人脸是否为同一人:" + isSelf + ",相似度:" + similarity + ",对比耗时:" + sw.ElapsedMilliseconds + "ms";
richTextBox1.Text += msg + "\r\n";
Console.WriteLine(msg);
sw.Stop();
}
/// <summary>
/// 口罩检测
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string msg = "";
if (pictureBox1.Image == null)
{
msg = "图片1不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
FaceImage bitmap = new Bitmap(pictureBox1.Image).ToFaceImage();
FaceDetector faceDetector = new FaceDetector();
MaskDetector maskDetector = new MaskDetector();
if (faceDetector.Detect(bitmap).Length == 0)
{
msg = "图片1未检测到人脸";
richTextBox1.Text += msg + "\r\n";
return;
}
var info = faceDetector.Detect(bitmap).First();
PlotMaskResult plotMaskResult = maskDetector.PlotMask(bitmap, info);
if (plotMaskResult.Masked)
{
richTextBox1.Text += "口罩:是 \r\n";
}
else
{
richTextBox1.Text += "口罩:否 \r\n";
}
Console.WriteLine(msg);
}
/// <summary>
/// 年龄预测
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button6_Click(object sender, EventArgs e)
{
string msg = "";
if (pictureBox1.Image == null)
{
msg = "图片1不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
FaceImage bitmap = new Bitmap(pictureBox1.Image).ToFaceImage();
FaceDetector faceDetector = new FaceDetector();
if (faceDetector.Detect(bitmap).Length == 0)
{
msg = "图片1未检测到人脸";
richTextBox1.Text += msg + "\r\n";
return;
}
var info = faceDetector.Detect(bitmap).First();
AgePredictor agePredictor = new AgePredictor();
FaceLandmarker faceMark = new FaceLandmarker();
var markPoints = faceMark.Mark(bitmap, info);
int age = agePredictor.PredictAge(bitmap, markPoints);
richTextBox1.Text += "年龄:" + age + " \r\n";
Console.WriteLine(msg);
}
/// <summary>
/// 性别预测
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button7_Click(object sender, EventArgs e)
{
string msg = "";
if (pictureBox1.Image == null)
{
msg = "图片1不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
FaceImage bitmap = new Bitmap(pictureBox1.Image).ToFaceImage();
FaceDetector faceDetector = new FaceDetector();
if (faceDetector.Detect(bitmap).Length == 0)
{
msg = "图片1未检测到人脸";
richTextBox1.Text += msg + "\r\n";
return;
}
var info = faceDetector.Detect(bitmap).First();
GenderPredictor genderPredictor = new GenderPredictor();
FaceLandmarker faceMark = new FaceLandmarker();
var markPoints = faceMark.Mark(bitmap, info);
Gender gender = genderPredictor.PredictGender(bitmap, markPoints);
richTextBox1.Text += "性别:" + gender + " \r\n";
Console.WriteLine(msg);
}
/// <summary>
/// 眼睛状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button8_Click(object sender, EventArgs e)
{
string msg = "";
if (pictureBox1.Image == null)
{
msg = "图片1不能为空";
richTextBox1.Text += msg + "\r\n";
return;
}
FaceImage bitmap = new Bitmap(pictureBox1.Image).ToFaceImage();
FaceDetector faceDetector = new FaceDetector();
if (faceDetector.Detect(bitmap).Length == 0)
{
msg = "图片1未检测到人脸";
richTextBox1.Text += msg + "\r\n";
return;
}
var info = faceDetector.Detect(bitmap).First();
EyeStateDetector eyeStateDetector = new EyeStateDetector();
FaceLandmarker faceMark = new FaceLandmarker();
var markPoints = faceMark.Mark(bitmap, info);
EyeStateResult eyeStateResult = eyeStateDetector.Detect(bitmap, markPoints);
richTextBox1.Text += "眼睛状态:" + eyeStateResult + " \r\n";
Console.WriteLine(msg);
}
}
}
C# 人脸检测 人脸比对 活体检测 口罩检测 年龄预测 性别预测 眼睛状态检测的更多相关文章
- python——进行年龄和性别检测
年龄和性别检测 使用Python编程语言带你完成使用机器学习进行年龄和性别检测的任务. 首先需要编写用于检测人脸的代码,因为如果没有人脸检测,我们将无法进一步完成年龄和性别预测的任务. 下一步是预测图 ...
- 虹软人脸识别 - faceId及IR活体检测的更新介绍
虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...
- python3 百度AI-v3之 人脸对比 & 人脸检测 & 在线活体检测 接口
#!/usr/bin/python3 # 百度人脸对比 & 人脸检测api-v3 import sys, tkinter.messagebox, ast import ssl, json,re ...
- 虹软人脸识别 - faceId及IR活体检测的介绍
虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...
- iOS开发中使用CIDetector检测人脸
在iOS5 系统中,苹果就已经有了检测人脸的api,能够检测人脸的位置,包括左右眼睛,以及嘴巴的位置,返回的信息是每个点位置.在 iOS7中,苹果又加入了检测是否微笑的功能.通过使用 CIDetect ...
- UWP 使用Windows.Media.FaceAnalysis.FaceDetector检测人脸
话说现在检测人脸的技术有很多.有在线AI服务,比如Megvii Face++,Microsoft Cognitive Services,Tencent AI等等.还有本地的库实现的,比如OpenCV. ...
- python opencv3 静态图片检测人脸
git:https://github.com/linyi0604/Computer-Vision # coding:utf-8 import cv2 filename = "../data/ ...
- PCA检测人脸的简单示例_matlab实现
PCA检测人脸的简单示例,matlab R2009b上实现训练:训练用的20副人脸: %训练%Lx=X'*Xclear;clc;train_path='..\Data\TrainingSet\';ph ...
- 使用dlib基于CNN(卷积神经网络)的人脸检测器来检测人脸
基于机器学习CNN方法来检测人脸比之前介绍的效率要慢很多 需要先下载一个训练好的模型数据: 地址点击下载 // dlib_cnn_facedetect.cpp: 定义控制台应用程序的入口点. // # ...
- 20行Python代码检测人脸是否佩戴口罩
最近,口罩成为绝对热门的话题,在疫情之下,出门不戴口罩不仅对自己不负责,对他人而言也是一种潜在的威胁.所以许多小区都有保安在门口守着,谁要是不戴口罩就吼回去(吓死我了). 很多人学习python,不知 ...
随机推荐
- 【Android】使用MediaExtractor获取关键帧的时间戳
1 前言 使用MediaExtractor.MediaMuxer去掉视频文件中的音频数据 中介绍了 MediaExtractor 类的主要方法,本文主要将使用其 advance() 和 seekTo( ...
- java常用包下载地址(非maven)
httpclient与httpcore: http://hc.apache.org/downloads.cgi jdbc: https://dev.mysql.com/downloads/connec ...
- springboot项目使用外置tomcat7部署项目
Springboot使用外置tomcat7部署运行 1.pom修改 2.tomcat底下config下catalina.properties 3.在tomcat的lib文件夹下添加 javax.el- ...
- 通过weblogic发布服务器某个文件夹
介绍 客户有一台老服务器,上面安装的是weblogic,现在有个需求是需要将服务器下面某个文件夹下的文件都发布出来供某前端直接访问.之前都是直接利用tomcat的webapps目录直接发布即可,搜索了 ...
- 前端树形Tree数据结构使用-🤸🏻♂️各种姿势总结
01.树形结构数据 前端开发中会经常用到树形结构数据,如多级菜单.商品的多级分类等.数据库的设计和存储都是扁平结构,就会用到各种Tree树结构的转换操作,本文就尝试全面总结一下. 如下示例数据,关键字 ...
- 学习go语言编程之工程管理
Go命令行工具 安装了Go语言的安装包后,就直接自带Go命令行工具. # 查看当前安装的Golang版本 go version # 查看go命令行工具的帮助信息 go help Go命令行工具可以完成 ...
- Aop @AfterReturning因返回类型不一致导致无法执行切面代码
要做返回异常之后,所有操作回滚的操作,本来想着泛型用 Object 就表示所有返回类型是 CommonResult 并且加指定注解的都走这个通知的代码,但是如下配置,无论如何也不生效 进入源码里发现, ...
- 公司官网建站笔记(二):在云服务器部署PHP服务(公网访问首页)
前言 上一篇重新安装了CentOS8.2之后,接下来开始安装部署PHP服务器,让公网可以访问到我们部署的PHP服务器首页. 背景 为什么自行搭建,是因为红胖子专业做相关Qt软件以及终端设备 ...
- dd命令创建文件
dd if=... of=... bs=... count=... if表示输入文件,of表示输出文件,bs默认指定了以字节为单位的块大小(单位有字节c,字w,块B,千字节m,兆字节m,吉字节G),c ...
- c# rdkafka 设置偏移量(offset)
参考资料: librdkafka: 如何设置Kafka消费者订阅消息的起始偏移位置 领导要求kafka消费者端消费最新的数据. 不知道怎么设置偏移量,查了资料. 用惯了封装好的东西,都不知道怎么设置了 ...