C#winforms实现windows窗体人脸识别

在之前我写过一篇博客,是关于javaweb实现人脸识别,包括数据库以及java源码,还有相关的jar包都已经上传了,有想要了解的可以去看看,地址是:java实现人脸识别源码
实现了之后又正好朋友开发C#,想要我顺便给写个小功能的人脸识别,于是我就打开我的笔记本就干起代码了,既然java都实现了,难不成还怕个C#实现不了?web端的已经实现了一遍,这次偶就来个高难度的,用winfroms写了一个玩玩,废话不多说,步入正题!
首先我们来先整一个数据库,我这使用的版本:
数据库:sql server2012
C#开发工具:Visual Studio2012
操作系统:win10 家庭版

一、创建一个数据库,名为TestFaceDB

里面有一张表就OK了,表名Users,表里面有几个字段我说明一下:
id--------------------bigint----------------------编号
name--------------varchar(50)-----------------用户名
phone--------------varchar(50)----------------电话
password--------------varchar(50)------------密码
address--------------varchar(50)--------------地址
picture--------------varchar(50)---------------脸的图片
然后我吧数据库脚本放上来:

USE [master]
GO
/****** Object:  Database [TestFaceDB]    Script Date: 2017-11-30 22:09:36 ******/
CREATE DATABASE [TestFaceDB]CONTAINMENT = NONEON  PRIMARY 
( NAME = N'TestFaceDB', FILENAME = N'E:\DB\TestFaceDB.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON 
( NAME = N'TestFaceDB_log', FILENAME = N'E:\DB\TestFaceDB_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [TestFaceDB] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TestFaceDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TestFaceDB] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [TestFaceDB] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [TestFaceDB] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [TestFaceDB] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [TestFaceDB] SET ARITHABORT OFF 
GO
ALTER DATABASE [TestFaceDB] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [TestFaceDB] SET AUTO_CREATE_STATISTICS ON 
GO
ALTER DATABASE [TestFaceDB] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [TestFaceDB] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [TestFaceDB] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [TestFaceDB] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [TestFaceDB] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [TestFaceDB] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [TestFaceDB] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [TestFaceDB] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [TestFaceDB] SET  DISABLE_BROKER 
GO
ALTER DATABASE [TestFaceDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [TestFaceDB] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [TestFaceDB] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [TestFaceDB] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [TestFaceDB] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [TestFaceDB] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [TestFaceDB] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [TestFaceDB] SET RECOVERY FULL 
GO
ALTER DATABASE [TestFaceDB] SET  MULTI_USER 
GO
ALTER DATABASE [TestFaceDB] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [TestFaceDB] SET DB_CHAINING OFF 
GO
ALTER DATABASE [TestFaceDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [TestFaceDB] SET TARGET_RECOVERY_TIME = 0 SECONDS 
GO
EXEC sys.sp_db_vardecimal_storage_format N'TestFaceDB', N'ON'
GO
USE [TestFaceDB]
GO
/****** Object:  Table [dbo].[Users]    Script Date: 2017-11-30 22:09:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Users]([id] [bigint] NOT NULL,[name] [varchar](50) NULL,[age] [int] NULL,[phone] [varchar](50) NULL,[password] [varchar](50) NULL,[address] [varchar](50) NULL,[picture] [varchar](max) NULL,CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
([id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GO
SET ANSI_PADDING OFF
GO
USE [master]
GO
ALTER DATABASE [TestFaceDB] SET  READ_WRITE 
GO

以上就是准备工作的数据库

二、在VS里面写代码之前我们需要引入一个AForgeDLL文件库

,下载地址:
C#处理视频dll库AForge下载安装版

三、在vs里面新建个项目,名称是:Camtest

新建完项目之后我们在新建个sqlhelper,这个文件是用来操作数据库的,主要是人脸注册和认证以及登陆的时候用。源码在这里:
C#人脸识别——————SqlHelper
新建一个实体类,名称就随便起个吧,我们命名为:Users,源码在这里:
C#人脸识别——————Users

四、人脸检测

接下来我们就开始写窗体,一步一步的来,接着往下看,我们先来整一个人脸检测的玩玩练练手吧:
这里写图片描述
这个是人脸检测的运行结果图!我们不注重界面的美化,我们只注重功能的实现。接下来我们分析一下这个窗体是由哪些控件组成的!
序号对应控件说明:
1--------------------videoSourcePlayer,所在的dll是Aforge.Controls.Video这个里面,名称是videoSourcePlayer1
2--------------------groupBox控件,名称是groupBox1
3--------------------comboBox控件,名称是comboBoxCameras和picsize
4--------------------button控件,名称是button2和close
5--------------------label控件,名称是(左边从上到下)label3,label6,label8,label10,label12,label14。右边从上到下:label4,label5,label7,label9,label11,label13
6--------------------窗体,名称是facedetection
接着我们看一下这个窗体内部的实现代码:
1.首先引入AForge的命名空间:、

using AForge;
using AForge.Controls;
using AForge.Imaging;
using AForge.Video;
using AForge.Video.DirectShow;

2.加载窗体的时候先检测一遍我们的摄像头:

 // 刷新可用相机的列表videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);comboBoxCameras.Items.Clear();for (int i = 0; i < videoDevices.Count; i++){comboBoxCameras.Items.Add(videoDevices[i].Name.ToString());}if (comboBoxCameras.Items.Count > 0)comboBoxCameras.SelectedIndex = 0;picsize.SelectedIndex = 0;

3.打开摄像头的方法:

 /// <summary>/// 打开摄像头/// </summary>public void openCan(){selectedPICIndex = picsize.SelectedIndex;selectedDeviceIndex = comboBoxCameras.SelectedIndex;//连接摄像头。videoSource = new VideoCaptureDevice(videoDevices[selectedDeviceIndex].MonikerString);videoSource.VideoResolution = videoSource.VideoCapabilities[selectedDeviceIndex];// 枚举所有摄像头支持的像素,设置拍照为1920*1080foreach (VideoCapabilities capab in videoSource.VideoCapabilities){if (selectedPICIndex == 0){if (capab.FrameSize.Width == 1920 && capab.FrameSize.Height == 1080){videoSource.VideoResolution = capab;break;}if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}else{if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}}videoSourcePlayer1.VideoSource = videoSource;// set NewFrame event handlervideoSourcePlayer1.Start();}

4.保存人脸成一张图片,顺便调用人脸检测库:

//保存图片private void button2_Click(object sender, EventArgs e){if (videoSource == null)return;Bitmap bitmap = videoSourcePlayer1.GetCurrentVideoFrame();//图片名称,年月日时分秒毫秒.jpgstring fileName = DateTime.Now.ToString("yyyyMMddHHmmssff") + ".jpg";//获取项目的根目录String path = AppDomain.CurrentDomain.BaseDirectory;//将图片保存在服务器里面bitmap.Save(path + "\\picture\\" + fileName, ImageFormat.Jpeg);bitmap.Dispose();//进行面部特征识别facemodel facem = face_test.FaceDetect(path + "\\picture\\" + fileName);this.label4.Text = facem.age;      //年龄this.label5.Text = facem.beauty;  //漂亮度string expression = facem.expression;//表情if (expression.Equals("0")){this.label7.Text = "不笑";}else if (expression.Equals("1")){this.label7.Text = "微笑";}else if (expression.Equals("2")){this.label7.Text = "大笑";}string gender = facem.gender;//性别if (gender.Equals("male")){this.label9.Text = "男";}else{this.label9.Text = "女";}string glasses = facem.glasses;//是否戴眼镜if (glasses.Equals("0")){this.label11.Text = "无眼镜";}else if (glasses.Equals("1")){this.label11.Text = "普通眼镜";}else{this.label11.Text = "墨镜";}string race = facem.race;//人种if (race.Equals("yellow")){this.label13.Text = "黄人";}else if (race.Equals("white")){this.label13.Text = "白人";}else if (race.Equals("black")){this.label13.Text = "黑人";}else if (race.Equals("arabs")){this.label13.Text = "棕人";}}

在上面的这个方法里面我们需要一个解析json的类,类的源码在:
人脸检测解析json的工具类face_test
还有一个model类,类的源码在:
人脸检测的model类facemodel
这就是我们主要的功能实现,整个窗体的源码请移步到这里面看:
人脸检测源码facedetection
最后完美运行。

五、人脸注册

1.新建一个窗体,名称是:faceregiste
下面是运行结果:

人脸注册
至于控件什么的我就不说的那么详细了,大家一看就知道用的什么控件了。
2.由于调用的是百度的API,所以需要Api_Key和Secret_Key,关于这两个,大家可以自行百度。所以先声明一下:

		//Api_Keypublic static string Api_Key = "这里是你的Api_Key";//Secret_Keypublic static string Secret_Key = "这里是你的Secret_Key ";

3.刷新可用摄像头列表

  //加载项目private void faceregiste_Load(object sender, EventArgs e){// 刷新可用相机的列表videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);comboBoxCameras.Items.Clear();for (int i = 0; i < videoDevices.Count; i++){comboBoxCameras.Items.Add(videoDevices[i].Name.ToString());}if (comboBoxCameras.Items.Count > 0)comboBoxCameras.SelectedIndex = 0;picsize.SelectedIndex = 0;//打开摄像头openCamera();}

5.打开摄像头:

//打开摄像头public void openCamera() {selectedPICIndex = picsize.SelectedIndex;selectedDeviceIndex = comboBoxCameras.SelectedIndex;//连接摄像头。videoSource = new VideoCaptureDevice(videoDevices[selectedDeviceIndex].MonikerString);videoSource.VideoResolution = videoSource.VideoCapabilities[selectedDeviceIndex];// 枚举所有摄像头支持的像素,设置拍照为1920*1080foreach (VideoCapabilities capab in videoSource.VideoCapabilities){if (selectedPICIndex == 0){if (capab.FrameSize.Width == 1920 && capab.FrameSize.Height == 1080){videoSource.VideoResolution = capab;break;}if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}else{if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}}videoSourcePlayer1.VideoSource = videoSource;// set NewFrame event handlervideoSourcePlayer1.Start();}

6.点击注册执行的方法:

 //注册的按钮private void register_Click(object sender, EventArgs e){Users user = new Users();user.name = this.name.Text;user.id = DateTime.Now.Ticks / 10000;user.password = this.password.Text;user.phone = this.phone.Text;user.age =(int)this.age.Value;user.address = this.address.Text;user.picture = SavePicture() ;//注册人脸通过的话进去if (FaceRegister(user)){int rel = AddUsers(user);//添加信息if (rel > 0){MessageBox.Show("注册成功", "提示信息");}else{MessageBox.Show("添加失败", "提示信息");}}}

7.保存图片的方法:

/// <summary>/// 保存图片/// </summary>public string SavePicture() {if (videoSource == null){return null;}Bitmap bitmap = videoSourcePlayer1.GetCurrentVideoFrame();//图片名称,年月日时分秒毫秒.jpgstring fileName = DateTime.Now.ToString("yyyyMMddHHmmssff") + ".jpg";//获取项目的根目录string path = AppDomain.CurrentDomain.BaseDirectory;string picture = path + "\\picture\\" + fileName;//将图片保存在服务器里面bitmap.Save(picture, ImageFormat.Jpeg);bitmap.Dispose();return picture;}

8.取消按钮的方法:

 //取消的按钮private void close_Click(object sender, EventArgs e){//停止摄像头videoSourcePlayer1.Stop();this.Close();welcome we = new welcome();we.Show();}

10.用户注册的方法:

/// <summary>/// 用户注册/// </summary>/// <param name="users"></param>/// <returns></returns>public int AddUsers(Users users){int rel = 0;string sql = "insert INTO Users VALUES(@id,@name,@age,@phone,@password,@address,@picture)";SqlParameter[] param = {new SqlParameter("@id",users.id),new SqlParameter("@name",users.name),new SqlParameter("@age",users.age),new SqlParameter("@phone",users.phone),new SqlParameter("@password",users.password),new SqlParameter("@address",users.address),new SqlParameter("@picture",users.picture)};rel = SqlHelper.ExecuteNonQuery(sql, CommandType.Text, param);return rel;}

11.人脸注册的方法:

 /// <summary>/// 人脸注册/// </summary>/// <param name="picture"></param>public static bool FaceRegister(Users user){var client = new Baidu.Aip.Face.Face(Api_Key, Secret_Key);//当前毫秒数可能是负数,取绝对值var image1 = File.ReadAllBytes(user.picture);var result = client.User.Register(image1, user.id.ToString(), user.name, new[] { "gr_test" });//得到根节点JObject jo_result = (JObject)JsonConvert.DeserializeObject(result.ToString());if ((string)jo_result["error_msg"] != null){MessageBox.Show("对不起,请把脸放上!","提示",MessageBoxButtons.OK,MessageBoxIcon.Stop);return false;}return true;}

12.关闭窗体的方法:

 //关闭窗体private void faceregiste_FormClosing(object sender, FormClosingEventArgs e){DialogResult r = MessageBox.Show("确定要退出程序?", "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);if (r != DialogResult.OK){e.Cancel = true;}videoSourcePlayer1.Stop();//停止摄像头videoSourcePlayer1.Dispose();}

源码请到这里来看:
人脸注册源码faceregiste

六、人脸认证

1.新建一个窗体,名称为faceIdentify,其运行结果是:
人脸认证
人脸认证
人脸认证
这些控件的名称我也不多说,基本都能知道,下面我们来介绍一下代码:
2.窗体加载刷新摄像头列表:

 //窗体加载private void faceIdentify_Load(object sender, EventArgs e){//显示为正在检测this.label1.Text = this.label2.Text = this.label6.Text = this.label9.Text = "正在识别";// 刷新可用相机的列表videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);comboBoxCameras.Items.Clear();for (int i = 0; i < videoDevices.Count; i++){comboBoxCameras.Items.Add(videoDevices[i].Name.ToString());}if (comboBoxCameras.Items.Count > 0)comboBoxCameras.SelectedIndex = 0;picsize.SelectedIndex = 0;//打开摄像头openCamera();}

3.打开摄像头:

//打开摄像头public void openCamera(){selectedPICIndex = picsize.SelectedIndex;selectedDeviceIndex = comboBoxCameras.SelectedIndex;//连接摄像头。videoSource = new VideoCaptureDevice(videoDevices[selectedDeviceIndex].MonikerString);videoSource.VideoResolution = videoSource.VideoCapabilities[selectedDeviceIndex];// 枚举所有摄像头支持的像素,设置拍照为1920*1080foreach (VideoCapabilities capab in videoSource.VideoCapabilities){if (selectedPICIndex == 0){if (capab.FrameSize.Width == 1920 && capab.FrameSize.Height == 1080){videoSource.VideoResolution = capab;break;}if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}else{if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}}videoSourcePlayer1.VideoSource = videoSource;// set NewFrame event handlervideoSourcePlayer1.Start();}

4.签到的按钮:

/// <summary>/// 签到的按钮/// 先保存图片,然后进行比较,获取的id,查询/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void qiandao_Click(object sender, EventArgs e){Users users = FaceIdentifys(SavePicture());this.label1.Text = users.age.ToString();this.label2.Text = users.name;this.label6.Text = users.phone;this.label9.Text = users.address;if (users.picture != null){this.pictureBox1.Image = Image.FromFile(users.picture, false);}}

5.人脸识别:

/// <summary>/// 人脸识别/// </summary>/// <param name="filename"></param>public static Users FaceIdentifys(string filename){long id = 0;string ids = "";double scores_num = 0;Users user = new Users();var client = new Baidu.Aip.Face.Face(Api_Key, Secret_Key);var image1 = File.ReadAllBytes(filename);var result = client.User.Identify(image1, new[] { "gr_test" }, 1, 1);//先判断脸是不是在上面,在继续看有匹配的没,否则提示放上脸//得到根节点JObject jo_result = (JObject)JsonConvert.DeserializeObject(result.ToString());if ((string)jo_result["error_msg"] != null){MessageBox.Show("对不起,请把脸放上!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);}else{//检测到脸//得到result节点JArray jo_age = (JArray)JsonConvert.DeserializeObject(jo_result["result"].ToString());foreach (var val in jo_age){id = long.Parse(((JObject)val)["uid"].ToString());  //获取uidstring scores = ((JObject)val)["scores"].ToString();//获取scoresint num1 = scores.IndexOf("\n") + 2;int num2 = scores.LastIndexOf("]")-8;ids = scores.Substring(num1, num2);scores_num =double.Parse(ids);}if (scores_num > 80){user = QueryUsersById(id);if (user.id != 0){MessageBox.Show("签到成功,已检测到您的信息", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}else{MessageBox.Show("对不起,系统根据您的脸未检测到信息", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);}}else {MessageBox.Show("对不起,系统根据您的脸未检测到信息", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);}}return user;}

6.保存图片:

 /// <summary>/// 保存图片/// </summary>public string SavePicture(){if (videoSource == null){return null;}Bitmap bitmap = videoSourcePlayer1.GetCurrentVideoFrame();//图片名称,年月日时分秒毫秒.jpgstring fileName = DateTime.Now.ToString("yyyyMMddHHmmssff") + ".jpg";//获取项目的根目录string path = AppDomain.CurrentDomain.BaseDirectory;string picture = path + "\\picture\\" + fileName;//将图片保存在服务器里面bitmap.Save(picture, ImageFormat.Jpeg);bitmap.Dispose();return picture;}

7.根据编号查询用户信息:

/// <summary>/// 根据编号查询用户信息/// </summary>/// <param name="id"></param>/// <returns></returns>public static Users QueryUsersById(long id){Users user = new Users();string sql = "select * from users where id = @id";using (SqlDataReader reader = SqlHelper.ExcuteReader(sql, CommandType.Text, new SqlParameter("@id", id))){if (reader.Read()){user.id = long.Parse(reader[0].ToString());user.name = reader[1].ToString();user.age = Convert.ToInt32(reader[2]);user.phone = reader[3].ToString();user.password = reader[4].ToString();user.address = reader[5].ToString();user.picture = reader[6].ToString();}}return user;}

源码请在这里面看:
人脸认证源码faceIdentify

七、人脸登陆

1.新建一个窗体,参考如下:
人脸登陆
人脸登陆
2.窗体加载刷新摄像头列表:

//窗体加载private void faceIdentify_Load(object sender, EventArgs e){//显示为正在检测this.label1.Text = this.label2.Text = this.label6.Text = this.label9.Text = "正在识别";// 刷新可用相机的列表videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);comboBoxCameras.Items.Clear();for (int i = 0; i < videoDevices.Count; i++){comboBoxCameras.Items.Add(videoDevices[i].Name.ToString());}if (comboBoxCameras.Items.Count > 0)comboBoxCameras.SelectedIndex = 0;picsize.SelectedIndex = 0;//打开摄像头openCamera();}

3.打开摄像头:

//打开摄像头public void openCamera(){selectedPICIndex = picsize.SelectedIndex;selectedDeviceIndex = comboBoxCameras.SelectedIndex;//连接摄像头。videoSource = new VideoCaptureDevice(videoDevices[selectedDeviceIndex].MonikerString);videoSource.VideoResolution = videoSource.VideoCapabilities[selectedDeviceIndex];// 枚举所有摄像头支持的像素,设置拍照为1920*1080foreach (VideoCapabilities capab in videoSource.VideoCapabilities){if (selectedPICIndex == 0){if (capab.FrameSize.Width == 1920 && capab.FrameSize.Height == 1080){videoSource.VideoResolution = capab;break;}if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}else{if (capab.FrameSize.Width == 1280 && capab.FrameSize.Height == 720){videoSource.VideoResolution = capab;break;}}}videoSourcePlayer1.VideoSource = videoSource;// set NewFrame event handlervideoSourcePlayer1.Start();}

4.点击确定的按钮,(人脸登陆):

/// <summary>/// 点击确定的按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){//先获取用户名//然后在提取图片//先查询用户名,看看有没有该用户名//有该用户名的话继续判断人脸对应不,没有的话提示没有该用户string name = this.textBox1.Text;Users user = QueryUsersByName(name);if (((string)(user.name))!=""){//有该用户,判断摄入的人脸和人脸库中的对比FaceVerify(SavePicture(),user);}else { //说明没有该用户,提示用户重新输入用户名MessageBox.Show("对不起,检测到没有该用户,请重新输入", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);}}

5.人脸认证【登陆】:

/// <summary>/// 人脸认证【登陆】/// </summary>public  void FaceVerify(string filename,Users users){var client = new Baidu.Aip.Face.Face(Api_Key ,Secret_Key);var image1 = File.ReadAllBytes(filename);var result = client.User.Verify(image1,(users.id).ToString(), new[] { "gr_test" }, 1);//先判断脸是不是在上面,在继续看有匹配的没,否则提示放上脸//得到根节点JObject jo_result = (JObject)JsonConvert.DeserializeObject(result.ToString());if ((string)jo_result["error_msg"] != null){MessageBox.Show("对不起,请把脸放上!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);}else{//检测到脸//得到result节点JArray jo_age = (JArray)JsonConvert.DeserializeObject(jo_result["result"].ToString());string resu = jo_age.ToString();int num1 = resu.IndexOf("\n") + 2;int num2 = resu.LastIndexOf("]") - 8;string ids = resu.Substring(num1, num2);if (ids != null || !ids.Equals("")){double scores_num = double.Parse(ids);if (scores_num > 80){MessageBox.Show("登陆成功,已检测到您的信息", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}else{MessageBox.Show("对不起,脸与账户不对应,请换张脸试试", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);}}}}

6.根据编号查询用户信息:

/// <summary>/// 根据编号查询用户信息/// </summary>/// <param name="id"></param>/// <returns></returns>public static Users QueryUsersByName(string name){Users user = new Users();string sql = "select * from users where name = @name";using (SqlDataReader reader = SqlHelper.ExcuteReader(sql, CommandType.Text, new SqlParameter("@name", name))){if (reader.Read()){user.id = long.Parse(reader[0].ToString());user.name = reader[1].ToString();user.age = Convert.ToInt32(reader[2]);user.phone = reader[3].ToString();user.password = reader[4].ToString();user.address = reader[5].ToString();user.picture = reader[6].ToString();}}return user;}

7.保存图片:

  /// <summary>/// 保存图片/// </summary>public string SavePicture(){if (videoSource == null){return null;}Bitmap bitmap = videoSourcePlayer1.GetCurrentVideoFrame();//图片名称,年月日时分秒毫秒.jpgstring fileName = DateTime.Now.ToString("yyyyMMddHHmmssff") + ".jpg";//获取项目的根目录string path = AppDomain.CurrentDomain.BaseDirectory;string picture = path + "\\picture\\" + fileName;//将图片保存在服务器里面bitmap.Save(picture, ImageFormat.Jpeg);bitmap.Dispose();return picture;}

源码请在这里看:
人脸登陆facelogin

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSS.Common获取枚举字典列表标准库支持

上篇&#xff08;.Net Standard扩展支持实例分享&#xff09;介绍了OSS.Common的标准库支持扩展&#xff0c;也列举了可能遇到问题的解决方案。由于时间有限&#xff0c;同时.net standard暂时还没有提供对DescriptionAttribute的支持&#xff0c;所以其中的转化枚举到字典列表…

程序员的情人节礼物:当天微软开始Build 2017登记

2016 年 12 月&#xff0c;微软曾经宣布 Build 2017 大会将于 2017 年 5 月 10 日至 12 日在美国西雅图举行&#xff1b;时隔两个月&#xff0c;关于 Build 2017 大会的消息&#xff0c;终于有了新的进展。 2 月 10 日&#xff0c;微软在官方博客中宣布 Build 2017 大会将开启注…

查找前端依赖 jquery css js 时间控件 不要用远程依赖 会变化的 card

BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 找到你要的版本

使用VS Code从零开始开发调试.NET Core 1.1

使用VS Code 从零开始开发调试.NET Core 1.1。无需安装VS 2017 RC 即可开发调试.NET Core 1.1应用。 .NET Core 1.1 发布也有一段时间了&#xff0c;最大的改动是从 project.json 还原回了csproj 。 今天微软发布 .NET Core SDK 1.0 RC4 版本&#xff0c;离RTM版本也很近了。 对…

冒泡排序+推导过程

推导过程 代码实现 package com.atguigu.sort;import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/3/21* 描述*/ public class BubbleSort {public static void main(String[] args) {int arr[]{3,9,-1,10,-2};//为了容易理解&#xff0c;我们吧冒泡排序的演变过程给大家…

.Net Core 之 MSBuild 介绍

前言 关于 .NET Core 旧版本的 sdk 介绍可以参看我以前的 这篇 文章。 8 个小时前&#xff0c;.NET Core 项目组释放了 .NET Core 新一轮的 sdk 工具更新&#xff0c;即 RC4 版本 &#xff0c;这个版本也就是意味着基本功能已经确定了&#xff0c;下个版本应该就是RTM版了&…

mysql加索引快很多

3秒 变成 0.1秒 左连接的字段加索引 order by字段加索引 频繁使用的检索字段加索引

jQuery 基础教程 (四)之jQuery中的DOM操作

一、jQuery 中的 DOM 操作 &#xff08;1&#xff09;DOM(Document Object Model—文档对象模型)&#xff1a;一 种与浏览器, 平台, 语言无关的接口, 使用该接口可以 轻松地访问页面中所有的标准组件 &#xff08;2&#xff09;DOM 操作的分类: (A)DOM Core: DOM Core 并不专…

.Net大户的选择:Windows Container在携程的应用

数人云上海&深圳两地“ 容器之Mesos/K8S/Swarm三国演义”的嘉宾精彩实录第四弹&#xff01;小数已经被接连不断的干货搞晕了&#xff0c;沉浸技术的海洋好幸福~Windows container在国内的实践还比较少&#xff0c;携程作为.Net大户&#xff0c;率先进行了调研和实践应用&am…

真正理解线程上下文类加载器(多案例分析)

转载自 真正理解线程上下文类加载器&#xff08;多案例分析&#xff09; 前置知识&#xff1a; java类加载器不完整分析 前言 此前我对线程上下文类加载器&#xff08;ThreadContextClassLoader&#xff0c;下文使用TCCL表示&#xff09;的理解仅仅局限于下面这段话&#x…

Docker4Dev #6 使用 Windows Container 运行.net应用

关于d4d系列&#xff1a;之前这个系列叫做docker4dotnet&#xff0c;因为当时主要是为了能够探索在docker上运行.net应用&#xff1b;现在我觉得应该叫做docker4developer&#xff0c;因为我希望能够帮助更多的开发人员使用docker技术。今天这篇就算是新的Docker4Dev系列的开始…

Windows 容器

什么是容器 它们是隔离、资源控制且可移植的操作环境。 基本上&#xff0c;容器是一个隔离的位置&#xff0c;应用程序可在其中运行&#xff0c;而不会影响系统的其他部分&#xff0c;并且系统也不会影响该应用程序。 容器是虚拟化的下一个演化。 如果你在容器内&#xff0c;看…

选择排序+推导过程

图解 代码实现 package com.atguigu.sort;import java.util.Arrays; import java.util.List;/*** 创建人 wdl* 创建时间 2021/3/21* 描述*/ public class SelectSort {public static void main(String[] args) {int []arr{101,34,119,1};System.out.println("排序前"…

Echart折线图 柱状图

echat_百度搜索 Examples - Apache ECharts Examples - Apache ECharts Examples - Apache ECharts 修改左侧的数据 点击右侧下载可以得到html页面 Examples - Apache ECharts Examples - Apache ECharts

软件定义数据中心—Windows Server SDDC技术与实践

《软件定义数据中心—Windows Server SDDC技术与实践》是国内第一本讲解微软Windows Server 软件定义数据中心的中文图书&#xff0c;书中系统、全面地介绍了微软Windows Server 软件定义数据中心各个模块&#xff08;SDS/SDN/SDC/容器&#xff09;的概念、技术和架构&#xff…

插入排序+思路分析

图解 代码实现 package com.atguigu.sort;import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/3/22* 描述*/ public class InsertSort {public static void main(String[] args) {int[] arr{101,34,119,1};insertSort(arr);}//插入排序public static void insertSort(in…

.NET 十五岁,谈谈我眼中的.NET

2002年2月13日&#xff0c;第一个版本随着visual studio.net的发布&#xff0c;今天已经走过15年, .net团队写了一篇文章&#xff0c;里面有一个视频&#xff0c;Anders Hejlsberg已是白发苍苍的老人&#xff0c;我也从刚出校门的码农长成软件开发工程师&#xff0c;我爱编程。…

理解并从头搭建redis集群

部分开发人员工作当中只是在应用中使用redis&#xff0c;比如用来做数据结果的缓存。而且现在有很多不错的redis客户端工具(redisson)&#xff0c;基本上可以不用关注redis命令就可以完成相当部分的功能。所以可能会对如下这些问题关注点不够&#xff1a; 如何容灾&#xff1f;…