第五章,人脸识别与管理系统开发之登录窗体实现(刷脸登录)

摘要:通过人脸识别与管理系统登录界面的开发(WinForm界面增强,OpenCV-Python智能识别),我将以一个用户登录窗体的两种不同登录验证方式向各位同学介绍如何利用WinForm开发出漂亮的应用程序窗体,为我们后面的各个章节中的窗体开发打下基础。另外也会向各位同学介绍WinForrm窗体如何调用Python程序让OpenCV-Python程序嵌入到我们的登录窗体中,从而实现人脸识别的。博文提供了完整的Python代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。本博文目录如下:

本章节主要介绍的内容如下:
一,如何利用opencv-python实现多个人脸的训练学习,生产yml的训练文件。

二,如果通过opencv-python自带的人脸检测器进行人脸检测,再通过已经训练好的yml进行人脸识别。

三,将已经识别到的人脸通sqlite中已经录入人脸的库进行用户比对。

目录:

1,创建人脸训练集结果

2,人脸识别实现

3,WinForm界面调用python实现扫脸登录

4,刷脸登录结果如下

===========================================================

1,创建人脸训练集结果

        通过摄像头采集多个不同的人脸训练数据集,供后面的人脸训练使用。采集人脸的代码如下:a,将用户基础信息登记到sqlite数据库中,并将人脸图片保存到本地文件夹中。

def save(UserId,UserName,Pwd,Tel,Gender,Email,Idcard):
   #连接到数据库
   #数据库文件是“FaceDetection.db”
   #如果数据库不存在的话,将会自动创建一个 数据库
   conn = sqlite3.connect("..\\FaceDetection.db")
   #创建一个游标 curson
   cursor = conn.cursor()
   #通过获取图片转BASE64存入sqlite3数据库
   print("请看着摄像头!!!")
   time.sleep(5)
   print("请输入您的姓名:")
   if(getFaceID.getFaceImg(UserId)):
      #保存人脸训练集
      getFaceID.getImagesAndLabels(UserId)

      cjq_path = "../Facedata/training_data/" + UserId + "/"
      #face_id = imgToBase64.ImgToBase64(cjq_path + str(UserId) + "."+UserName+".jpg")
      #Faceinfo=face_id
      print(cjq_path)
      sql = "insert into UserInfo(id,UserName,Pwd,Tel,Gender,Email,Idcard) values(\'"+UserId+"\',\'"+UserName+"\',\'"+Pwd+"\',\'"+Tel+"\',\'"+Gender+"\',\'"+Email+"\',\'"+Idcard+"\')"
      print(sql)
      cursor.execute(sql)
      print("信息录入成功")
   #关闭游标:
   cursor.close()
   #提交事物
   conn.commit()
   #关闭连接
   conn.close()

         b,人脸信息采集如下:

def getFaceImg(userid):
    face_cascade = cv2.CascadeClassifier(
        "..\\haarcascades\\haarcascade_frontalface_default.xml")
    eye_cascade = cv2.CascadeClassifier("..\\haarcascades\\haarcascade_eye.xml")
    cap = cv2.VideoCapture(0)
    cjq_path = "../Facedata/training_data/"+userid+"/"
    mkdir(cjq_path)
    count = 0
    while True:
        ret, img = cap.read()
        if ret is True:
            #如果摄像头成功读取图像,则将图像转换成灰度图像
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        else:
            break
        # 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表(x,y,w,h)
        faces = face_cascade.detectMultiScale(gray, 1.1, 5)
        # 如果检测出人脸,则对每一张人脸都做画矩形,并将其保存到同目录的Facedata文件夹中
        for (x, y, w, h) in faces:
            cv2.rectangle(img, (x, y), (x + w, y + w), (255, 0, 0))
            count += 1  # 保存图像
            cv2.imwrite(cjq_path + str(count) + "."+userid+".jpg", img)
        #cv2.imwrite("face_id.jpg", img)
        k = cv2.waitKey(30)
        if k == 27:  # 通过esc键退出摄像
            break
        elif count >= 50:  # 得到50个样本后退出摄像
            break  # 关闭摄像头
    cap.release()
    cv2.destroyAllWindows()
    return True

        c,保存人脸训练集

# 根据图像存储的文件路径,获取当前图像,然后对其进行一一的训练
def getImagesAndLabels(userid):
    faces = []
    labels = []
    cjq_path = "../Facedata/training_data/"
    mkdir(cjq_path)
    dirs = os.listdir(cjq_path)
    for dir_name in dirs:
        label = int(dir_name)
        subject_dir_path = cjq_path + "/" + dir_name
        subject_images_names = os.listdir(subject_dir_path)
        for image_name in subject_images_names:
            image_path = subject_dir_path + "/" + image_name
            image = cv2.imread(image_path)
            cv2.imshow("Training on image...", image)
            cv2.waitKey(100)
            # 检测脸部
            face, rect = detect_face(image)
            # 我们忽略未检测到的脸部
            if face is not None:
                # 将脸添加到脸部列表并添加相应的标签
                faces.append(face)
                labels.append(label)

    print('labels:', labels)
    print('faces:', faces)
    #保存人脸特征
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.train(faces, np.array(labels))
    #recognizer.write(r'face_trainer\trainer.yml')
    mkdir(cjq_path + "..\\face_trainer\\")
    recognizer.write(cjq_path + "..\\face_trainer\\trainer.yml")
    print("总共存在{0}个人. 已完成识别".format(len(np.unique(labels))))
    #print('脸部例子:',facesSamples[0])
    #print('身份信息:',ids[0])
    return faces,labels

2,人脸识别实现

#准备识别的图片
def face_detect_demo(img):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度
    #face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))
    face=face_detector.detectMultiScale(gray)
    for x,y,w,h in face:
        cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
        # 人脸识别
        ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
        #print('标签id:',ids,'置信评分:', confidence)
        if confidence > 80:
            global warningtime
            warningtime += 1
            if warningtime > 200:
               #warning()
                warningtime = 0
            global checkResult
            checkResult = False
            cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            #global checkResult
            checkResult = True
            global checkname
            checkname = str(names[ids])
            cv2.putText(img,checkname, (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv2.imshow('CheckFaceWindow',img)
    return checkResult,checkname,warningtime

def checkface():
    cap = cv2.VideoCapture(0)
    while True:
        # 获取每一帧的画面
        ret, frame = cap.read()
        if not ret:
            break
        resize_img = cv2.resize(frame, dsize=(346, 217))
        flog,checkname,errnum = face_detect_demo(resize_img)
        if flog:
            print(str(checkResult)+','+checkname+','+str(warningtime))
            break
        if int(errnum) > 199:
            print(str(checkResult)+','+checkname+','+str(warningtime))
            break
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        if cv2.getWindowProperty("CheckFaceWindow", cv2.WND_PROP_VISIBLE) < 1:
            break
    cv2.destroyAllWindows()
    cap.release()
    return checkResult,checkname,warningtime


if __name__ == '__main__':
    try:
        # 代码行
        # 加载训练数据集文件
        recogizer = cv2.face.LBPHFaceRecognizer_create()
        recogizer.read(os.path.abspath(pathyml))
        checkface()
    except Exception as err:
        # 捕捉异常
        str1 = 'default:' + str(err)
        print(str1)

3,WinForm界面调用python实现扫脸登录

 //执行刷脸登录
                //调用opencv-python 打开摄像头
                try
                {
                    string path = Application.StartupPath + @"\Script_Python\03CheckFace.py";//py文件路径
                    string argText = "1";
                    StartTest(path, "getcheckface", argText);
                }
                catch (Exception e1)
                {
                    MessageBox.Show(e1.Message);
                }
                //先启动第三方应用

                //开线程来查找窗体,不然UI线程会卡死

                Task.Run(() =>
                {
                    //getlocalImg是要查找的窗体名称,自行替换
                    if (SetWindow.FindWindow("CheckFaceWindow"))
                    {
                        this.Invoke(new Action(() =>
                        {
                            SetWindow.SetParent(sp_Face.Handle, "CheckFaceWindow");  //设置父容器
                        }));
                    }
                    else
                    {
                        MessageBoxEx.Show("未能查找到人脸窗体!", "人脸检测", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }
                });

4,刷脸登录结果如下

 

 5,源码分享,教学ppt分享

6,写在最后

        生活不是过山车,不会永远都刺激。它更像是一条缓和的抛物线,有时在顶点,有时在谷底,有时需要我们攀爬,有时需要我们俯冲。当你暂时处于谷底,要做的不是怨天尤人,而是积蓄力量,为即将到来的攀登做好准备。
 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
系统功能(平台管理端后台,物业管理端后台)1、小区人脸识别门禁系统云平台,支持全国各地不同的物业公司在线注册账号,不同物业公司管理旗下多个小区的云平台管理系统。2、合作单位(物业公司)管理:物业公司注册修改删除,我的公司,更改公司LOG;3、管理管理:根据不同角色设置不同的管理权限;4、小区管理,合作单位(物业公司)管理旗下小区资料;5、小区摄像头管理:摄像头的新增、修改及删除功能; 6、居民管理:居民资料新增,修改,删除,Excel批量导入,导出,居民人脸采集;7、访客登记:访客的新增,修改,删除,进入登记,离开登记,查询等功能;8、人脸识别:居民出入小区人脸识别功能,使用腾讯AI人脸识别技术实现;9、出入记录:居民出入小区的人脸识别记录查询;10、小区地图:所有运营小区在地图的分布情况,使用百度地图实现;11、使用Echarts技术实现小区人员分类统计(柱状)图表;12、菜单管理:新增、修改、删除菜单功能(包括目录,菜单,按钮)13、角色管理:新增、修改、删除角色(系统角色、单位角色)14、系统日志:记录了系统中所有操作的日志,方便查找问题,追溯原因;15、我的信息:修改单位的联系信息,单位图标等功能;运行环境:  1、JDK1.8及以上版本  2、Tomcat 8.5及以上版本  3、MySql 5.7及以上版本  4、Redis开发工具:  1、前端开发工具:Visual Studio Code  2、后端开发工具:Intellij IDEA使用技术:  1、Vue2.x+ElementUI(前端)  2、Springboot+MyBatisPlus+Redis+Shiro+Swagger(后端)  3、人脸识别技术(腾讯AI)  3、MySql数据库技术  4、Redis缓存技术  5、百度地图  6、Echarts图表技术  7、POI Excel导入导出技术  8、Shiro权限控制:菜单管理,角色管理,权限管理(按钮及用户级别权限)  9、 Swagger接口配置管理,接口文档管理技术  10、Token单点技术(一个用户不能同时在多个设备登录使用)   11、前后端分离跨域设置等技术

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珞珈鸡丝

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值