网站开发构建工具,沈阳h5建站,中国空间站纪念币,湖南微信网站一、创建一个数据库#xff0c;名为TestFaceDB
里面有一张表就OK了#xff0c;表名Users,表里面有几个字段我说明一下#xff1a;
id--------------------bigint----------------------编号
name--------------varchar(50)-----------------用户名
phone--------------v…一、创建一个数据库名为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 NTestFaceDB, FILENAME NE:\DB\TestFaceDB.mdf , SIZE 5120KB , MAXSIZE UNLIMITED, FILEGROWTH 1024KB )LOG ON
( NAME NTestFaceDB_log, FILENAME NE:\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 NTestFaceDB, NON
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二、引入一个AForgeDLL文件库
C#(Winform)通过添加AForge添加并使用系统摄像机-CSDN博客
三、在vs里面新建个项目 Name Camtest
在新建个sqlhelper这个文件是用来操作数据库的主要是人脸注册和认证以及登陆的时候用。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;namespace face
{/// summary/// 数据库工具类/// /summarypublic class SqlHelper{#region 获取数据库连接private static string GetConnectionString{get{return Data Source.;Initial CatalogTestFaceDB;Persist Security InfoTrue;User IDsa;Password171268; //转换成string类型}}#endregion#region 查询多条记录/// summary/// 查询多条记录/// params SqlParameter param 表示既可以传过来数组 也可以传过来单个值/// /summary/// param namesql/param/// param nametype/param/// param nameparam/param/// returns/returnspublic static SqlDataReader ExcuteReader(string sql, CommandType type, params SqlParameter[] param){SqlConnection conn new SqlConnection(GetConnectionString);SqlCommand cmd new SqlCommand(sql, conn);PreaPareCommand(sql, conn, cmd, type, param);//参数是关闭连接return cmd.ExecuteReader(CommandBehavior.CloseConnection);}#endregion#region DataSetpublic static DataSet ExexuteDataset(string sql, CommandType type, params SqlParameter[] param){using (SqlConnection conn new SqlConnection(GetConnectionString)){SqlCommand cmd new SqlCommand(sql, conn);PreaPareCommand(sql, conn, cmd, type, param);SqlDataAdapter sda new SqlDataAdapter(cmd);DataSet ds new DataSet();sda.Fill(ds);return ds;}}#endregion#region 查询返回一条记录/// summary/// 查询返回一条记录/// /summary/// param namesql/param/// param nametype/param/// param nameparam/param/// returns/returnspublic static Object ExecuteScalar(string sql, CommandType type, params SqlParameter[] param){using (SqlConnection conn new SqlConnection(GetConnectionString)){SqlCommand cmd new SqlCommand(sql, conn);PreaPareCommand(sql, conn, cmd, type, param);return cmd.ExecuteScalar();}}#endregion#region 命令对象装配//命令对象装配private static void PreaPareCommand(string sql, SqlConnection conn, SqlCommand cmd, CommandType type, params SqlParameter[] param){if (conn.State ! ConnectionState.Open){conn.Close();conn.Open();}cmd.CommandType type;if (param ! null){foreach (SqlParameter p in param){cmd.Parameters.Add(p);}}}#endregion#region 增删改public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] param){using (SqlConnection conn new SqlConnection(GetConnectionString)){SqlCommand cmd new SqlCommand(sql, conn);PreaPareCommand(sql, conn, cmd, type, param);return cmd.ExecuteNonQuery();}}#endregion}
}
再新建一个实体类命名为Users
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Camtest
{public class Users{//编号public long id { get; set; }//姓名public string name { get; set; }//密码public string password { get; set; }//年龄public int age { get; set; }//电话public string phone { get; set; }//地址public string address { get; set; }//脸public string picture { get; set; }}
}
四、人脸检测 空间组成
1. videoSourcePlayer所在的dll是Aforge.Controls.Video这个里面名称是videoSourcePlayer1
2. groupBox控件名称是groupBox1
3.comboBox控件名称是comboBoxCameras和picsize
4.button控件名称是button2和close
5. label控件名称是左边从上到下label3label6label8label10label12label14。右边从上到下label4label5label7label9label11label13
6窗体名称是facedetection
1.加载窗体的时候先检测一遍我们的摄像头: // 刷新可用相机的列表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;
2.打开摄像头的方法 /// summary/// 打开摄像头/// /summarypublic 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();}3.保存人脸成一张图片顺便调用人脸检测库
//保存图片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 棕人;}}4.解析json的类
using face;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Camtest
{public class face_test{public static string Api_Key 你的Api_Key;public static string Secret_Key 你的Secret_Key;/// summary/// 脸部比对/// /summary/// param nameimg/param/// returns/returnspublic static facemodel FaceDetect(String img){var client new Baidu.Aip.Face.Face(Api_Key, Secret_Key);var image File.ReadAllBytes(img);var options new Dictionarystring, object(){{face_fields, age,beauty,expression,gender,glasses,race}};string result client.FaceDetect(image, options).ToString();//解析json数据return json_test(result.ToString());}/// summary/// 解析json数据/// /summary/// param namejson/parampublic static facemodel json_test(string json){//得到根节点JObject jo_result (JObject)JsonConvert.DeserializeObject(json.ToString());//得到result节点JArray jo_age (JArray)JsonConvert.DeserializeObject(jo_result[result].ToString());//查找某个字段与值facemodel facem new facemodel();foreach (var val in jo_age){facem.age ((JObject)val)[age].ToString();facem.beauty ((JObject)val)[beauty].ToString();facem.expression ((JObject)val)[expression].ToString();facem.gender ((JObject)val)[gender].ToString();facem.glasses ((JObject)val)[glasses].ToString();facem.race ((JObject)val)[race].ToString();}return facem;}}
}
5.人脸检测的model类facemodel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace face
{public class facemodel{//年龄public string age { get; set; }//美丑public string beauty { get; set; }//表情public string expression { get; set; }//性别public string gender { get; set; }//是否戴眼镜public string glasses { get; set; }//人种public string race { get; set; }}
}
6.人脸检测源代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge;
using AForge.Controls;
using AForge.Imaging;
using AForge.Video;
using AForge.Video.DirectShow;
using face;namespace Camtest
{public partial class facedetection : Form{/// summary/// 人脸检测/// /summarypublic facedetection(){InitializeComponent();//启动默认在屏幕中间this.StartPosition System.Windows.Forms.FormStartPosition.CenterScreen;}FilterInfoCollection videoDevices;VideoCaptureDevice videoSource;public int selectedDeviceIndex 0;public int selectedPICIndex 0;/// summary/// 加载窗体/// /summary/// param namesender/param/// param namee/paramprivate void Form1_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;this.label4.Text this.label5.Text this.label7.Text this.label9.Text this.label11.Text this.label13.Text 正在识别;this.label4.ForeColor Color.Red;this.label5.ForeColor Color.Red;this.label7.ForeColor Color.Red;this.label9.ForeColor Color.Red;this.label11.ForeColor Color.Red;this.label13.ForeColor Color.Red;openCan();}//关闭窗体private void Form1_FormClosing(object sender, FormClosingEventArgs e){DialogResult r MessageBox.Show(确定要退出程序?, 操作提示, MessageBoxButtons.OKCancel, MessageBoxIcon.Question);if (r ! DialogResult.OK){e.Cancel true;}videoSourcePlayer1.Stop();//停止摄像头videoSourcePlayer1.Dispose();}//实时显示照片private void videoSourcePlayer1_Click(object sender, EventArgs e){}/// summary/// 打开摄像头/// /summarypublic 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();}//保存图片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 棕人;}}//取消的按钮private void close_Click(object sender, EventArgs e){//停止摄像头videoSourcePlayer1.Stop();this.Close();welcome we new welcome();we.Show();}}
}
五、人脸注册
新建一个窗体名称是faceregiste 1.调用的是百度的API所以需要Api_Key和Secret_Key关于这两个大家可以自行百度。 //Api_Keypublic static string Api_Key 这里是你的Api_Key;//Secret_Keypublic static string Secret_Key 这里是你的Secret_Key ;
2.刷新可用摄像头列表 //加载项目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();}
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.点击注册执行的方法 //注册的按钮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(添加失败, 提示信息);}}}5.保存图片方法
/// summary/// 保存图片/// /summarypublic 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;}
6.取消按钮方法 //取消的按钮private void close_Click(object sender, EventArgs e){//停止摄像头videoSourcePlayer1.Stop();this.Close();welcome we new welcome();we.Show();}
7..用户注册的方法
/// summary/// 用户注册/// /summary/// param nameusers/param/// returns/returnspublic 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;}
8.人脸注册方法 /// summary/// 人脸注册/// /summary/// param namepicture/parampublic 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;}
9.关闭窗体方法 //关闭窗体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();}
10、人脸注册源代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge;
using AForge.Controls;
using AForge.Imaging;
using AForge.Video;
using AForge.Video.DirectShow;
using face;
using System.Data.SqlClient;
using System.Drawing.Imaging;
using System.IO;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;namespace Camtest
{public partial class faceregiste : Form{//Api_Keypublic static string Api_Key OVYw5Ok0y9U8n6CfVPYt0wfZ;//Secret_Keypublic static string Secret_Key aCN3lupCarq3rC9G8Rylqz1d36Towp8G;public faceregiste(){InitializeComponent();//启动默认在屏幕中间this.StartPosition System.Windows.Forms.FormStartPosition.CenterScreen;}FilterInfoCollection videoDevices;VideoCaptureDevice videoSource;public int selectedDeviceIndex 0;public int selectedPICIndex 0;//加载项目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();}//打开摄像头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();}//注册的按钮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(添加失败, 提示信息);}}}/// summary/// 保存图片/// /summarypublic 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;}//取消的按钮private void close_Click(object sender, EventArgs e){//停止摄像头videoSourcePlayer1.Stop();this.Close();welcome we new welcome();we.Show();}/// summary/// 用户注册/// /summary/// param nameusers/param/// returns/returnspublic 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;}//关闭窗体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();}/// summary/// 人脸注册/// /summary/// param namepicture/parampublic 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;}}
}六、人脸登录 1. 窗体加载刷新摄像头列表
//窗体加载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();}
2.打开摄像头
//打开摄像头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();}
3.点击确定的按钮人脸登陆
/// summary/// 点击确定的按钮/// /summary/// param namesender/param/// param namee/paramprivate 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);}}
4.人脸认证【登陆】
/// summary/// 人脸认证【登陆】/// /summarypublic 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);}}}}
5.根据编号查询用户信息
/// summary/// 根据编号查询用户信息/// /summary/// param nameid/param/// returns/returnspublic 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;}
6..保存图片 /// summary/// 保存图片/// /summarypublic 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.人脸登录facelogin
using AForge.Video.DirectShow;
using face;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Camtest
{public partial class facelogin : Form{//Api_Keypublic static string Api_Key OVYw5Ok0y9U8n6CfVPYt0wfZ;//Secret_Keypublic static string Secret_Key aCN3lupCarq3rC9G8Rylqz1d36Towp8G;public facelogin(){InitializeComponent();//启动默认在屏幕中间this.StartPosition System.Windows.Forms.FormStartPosition.CenterScreen;}FilterInfoCollection videoDevices;VideoCaptureDevice videoSource;public int selectedDeviceIndex 0;public int selectedPICIndex 0;//窗体加载private void facelogin_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();}//打开摄像头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();}/// summary/// 点击确定的按钮/// /summary/// param namesender/param/// param namee/paramprivate 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);}}/// summary/// 人脸认证【登陆】/// /summarypublic 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);}}}}/// summary/// 根据编号查询用户信息/// /summary/// param nameid/param/// returns/returnspublic 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;}/// summary/// 保存图片/// /summarypublic 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;}/// summary/// 取消的按钮/// /summary/// param namesender/param/// param namee/paramprivate void close_Click(object sender, EventArgs e){//停止摄像头videoSourcePlayer1.Stop();this.Close();welcome we new welcome();we.Show();}}
}