python3+opencv+tkinter开发简单的人脸识别小程序
学校里有门图像处理的课程最终需要提交一个图像处理系统,
正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧
效果图如下

笔者IDE使用Pycharm,GUI编程直接使用内置的tkinter
环境:
python3.6
opencv4.1
首先导入需要使用的各个库
#-*- coding: utf-8 -*-
import sys
import importlib
import cv2
import tkinter as tk
import tkinter.messagebox
from tkinter import filedialog
之后我们需要做一个路径选择函数,因为毕竟不能每次识别而去手动改代码内的地址
而这个函数我们稍后会绑定至一个button方便使用
def selectPath():
global path_
path_ = filedialog.askopenfilename()
path.set(path_) path = tk.StringVar()
最关键的人脸识别函数
其中所使用到的训练参数数据下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades
并且xml文件需要放到项目目录下
def imgface():
try:
# github获取训练好的人脸的参数数据
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml') # 读取图片
image = cv2.imread(path_) #转化为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 探测图片中的人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.15,
minNeighbors=5,
minSize=(5, 5),
flags=cv2.IMREAD_GRAYSCALE) if(len(faces)==0):
tkinter.messagebox.showerror('错误', '未识别出人脸,请选择更为清晰的图片') print("find {0} faces!".format(len(faces))) # faces中的四个量分别为左上角的横坐标、纵坐标、宽度、长度
for (x, y, w, h) in faces:
cv2.rectangle(image,(x,y),(x+w,y+w),(255,245,0),1)
if (len(faces) > 0):
cv2.imshow("find {0} faces!".format(len(faces)), image) cv2.waitKey(0)
except:
tkinter.messagebox.showerror('错误', '请选择正确的图片文件!')
之后进行GUI编程:
importlib.reload(sys) window = tk.Tk()
window.title('人脸识别小程序') fm1 = tk.Frame(window)
fm2 = tk.Frame(window)
fm3 = tk.Frame(window) def selectPath():
global path_
path_ = filedialog.askopenfilename()
path.set(path_) path = tk.StringVar() Ltop=tk.Label(fm1,text="请选择图片路径")
B1=tk.Button(fm2, text = "路径选择", command = selectPath)
E1=tk.Entry(fm2, textvariable = path,bd=5)
B2=tk.Button(fm2, text = "确定", command =imgface)
Lbot=tk.Label(fm3,text="学号:1622107031xx 姓名:istw") Ltop.pack(side = tk.TOP)
B1.pack(side=tk.LEFT)
E1.pack(side = tk.LEFT)
B2.pack(side=tk.LEFT)
Lbot.pack(side = tk.BOTTOM) fm1.pack(side=tk.TOP)
fm2.pack(side=tk.TOP)
fm3.pack(side=tk.TOP) sw = window.winfo_screenwidth()
#得到屏幕宽度
sh = window.winfo_screenheight()
#得到屏幕高度
ww = 300
wh = 100
#窗口宽高为100
x = (sw-ww) / 2
y = (sh-wh) / 3
window.geometry("%dx%d+%d+%d" %(ww,wh,x,y)) window.mainloop()
怎么样,一个简单的有交互界面的小程序就写出来了,只不过因为运用的人脸训练数据是官方提供的好多年前的,所以识别精度并不会太准
整个工程代码如下:
#-*- coding: utf-8 -*-
import sys
import importlib
import cv2
import tkinter as tk
import tkinter.messagebox
from tkinter import filedialog def imgface():
try:
# github获取训练好的人脸的参数数据
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml') # 读取图片
image = cv2.imread(path_) #转化为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 探测图片中的人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.15,
minNeighbors=5,
minSize=(5, 5),
flags=cv2.IMREAD_GRAYSCALE) if(len(faces)==0):
tkinter.messagebox.showerror('错误', '未识别出人脸,请选择更为清晰的图片') print("find {0} faces!".format(len(faces))) # faces中的四个量分别为左上角的横坐标、纵坐标、宽度、长度
for (x, y, w, h) in faces:
cv2.rectangle(image,(x,y),(x+w,y+w),(255,245,0),1)
if (len(faces) > 0):
cv2.imshow("find {0} faces!".format(len(faces)), image) cv2.waitKey(0)
except:
tkinter.messagebox.showerror('错误', '请选择正确的图片文件!') importlib.reload(sys) window = tk.Tk()
window.title('人脸识别小程序') fm1 = tk.Frame(window)
fm2 = tk.Frame(window)
fm3 = tk.Frame(window) def selectPath():
global path_
path_ = filedialog.askopenfilename()
path.set(path_) path = tk.StringVar() Ltop=tk.Label(fm1,text="请选择图片路径")
B1=tk.Button(fm2, text = "路径选择", command = selectPath)
E1=tk.Entry(fm2, textvariable = path,bd=5)
B2=tk.Button(fm2, text = "确定", command =imgface)
Lbot=tk.Label(fm3,text="学号:1622107031xx 姓名:istw") Ltop.pack(side = tk.TOP)
B1.pack(side=tk.LEFT)
E1.pack(side = tk.LEFT)
B2.pack(side=tk.LEFT)
Lbot.pack(side = tk.BOTTOM) fm1.pack(side=tk.TOP)
fm2.pack(side=tk.TOP)
fm3.pack(side=tk.TOP) sw = window.winfo_screenwidth()
#得到屏幕宽度
sh = window.winfo_screenheight()
#得到屏幕高度
ww = 300
wh = 100
#窗口宽高为100
x = (sw-ww) / 2
y = (sh-wh) / 3
window.geometry("%dx%d+%d+%d" %(ww,wh,x,y)) window.mainloop()
还有一个问题就是关于.py文件如何向别人展示的问题,因为不是每个人的电脑中都有py环境的,并且各个版本也不兼容,所以我们为了方便展示,有时候会运用些方法将其转换为exe文件,这个以后会讲到。
python3+opencv+tkinter开发简单的人脸识别小程序的更多相关文章
- 2018-09-28 用Python3和tkinter开发简单图形界面程序
源码库: program-in-chinese/wubi_code_editor 起因在这里. 由于此项目和汉字相关, 个人也想尝试Python的图形界面开发, 于是开始尝试. 遇到的一个坑. 用户测 ...
- 10分钟手把手教你运用Python实现简单的人脸识别
欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 前言:让我的电脑认识我 我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现高大上的人脸识别技术! Python里,简单的 ...
- java使用face++简单实现人脸识别注册登录
java使用face++简单实现人脸识别注册登录 前言 人脸识别,好高大上!!! 理解之后很简单. 支付宝使用的就是face++, 至于face++账号信息,apikey…..,本文不做讲述,网上很多 ...
- 基于Tesseract的OCR识别小程序
一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...
- 微信小程序开发系列(一)小程序开发初体验
开发小程序所需的基本技能 关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领大家快速地学习和掌握小程序的开发. 关于还没有接触过小程序的开发者来说,最关心的问题无非就是,开发小 ...
- mpvue开发美团外卖点餐小程序
mpvue-meituan mpvue-meituan 是一款使用mpvue开发的实战小程序项目,完全仿制美团官方外卖点餐小程序开发而成,项目的框架结构完全按照企业开发架构搭建而成.结合了原生小程序的 ...
- [转]微信小程序开发系列(一)小程序开发初体验
本文转自:http://www.cnblogs.com/rennix/p/6287432.html 开发小程序所需的基本技能 关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领 ...
- 头脑王者pk答题小程序开发思路 微信pk答题小程序开发 PK答题游戏你也可以做 微信pk答题游戏
想必大家最近的朋友圈和微信群里都被头脑王者PK答题刷屏了吧.确实很好玩,尤其是2018年的这波风口,手机答题,大家掏出手机,创建一个好友PK,然后你的好友点击进来就可以和你一起PK答题.比之前的游戏好 ...
- 微信小程序开发系列五:微信小程序中如何响应用户输入事件
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
随机推荐
- 【原创】ApacheTomcat集群在Linux下的搭建步骤
在RedHat5(以下简称RH)上搭建ApacheTomcat的集群环境,有以下步骤: 1.首先安装apr和apr-util apr-util需要依赖于apr包,所以先安装apr, http://fi ...
- HDU 3015 Disharmony Trees 【 树状数组 】
题意:给出n棵树,给出横坐标x,还有它们的高度h,先按照横坐标排序,则它们的横坐标记为xx, 再按照它们的高度排序,记为hh 两颗树的差异度为 abs(xx[i] - xx[j]) * min(hh[ ...
- vmware workstation中的NAT配置
宿主机:win10: IP:192.168.1.101 GW:192.168.1.1 以太网2(VMNET8) IP:192.168.100.1 GW:nonevmware中的虚拟网络设置(NAT): ...
- rman备份简介
登陆rman: [oracle@oracle ~]$ rman target / connected to target database: FSDB (DBID=1179347208) 执行全备: ...
- ZBrush中功能强大的插件PaintStop
PaintStop是ZBrush®3.1的手绘插件,可以比较真实的模拟手绘风格,尤其是用水彩笔刷画水墨风格画.PaintStop插件可供用户免费使用. PaintStop是一款功能强大的插件,已经被添 ...
- 写入~/.bashrc 文件
1.进入~/.bashrc 文件 vim ~/.bashrc 2.按下I键,然后按Enter键 加入路径 3.按ESC键退出,再按:wq! 保存即可.
- python学习笔记:第九天
Linux学习 1.linux虚拟机安装: 1.1win10-64为系统:链接:https://pan.baidu.com/s/1Wz8U1B_OMLaYlYr_SC75Zw 提取码:fe9k ,有U ...
- 紫书 习题8-9 UVa 1613 (dfs染色+图的性质)
这道题一开始我没想什么直接开始染, 但是是for循环一个节点一个节点染, 然后就WA 后了看了https://www.cnblogs.com/jerryRey/p/4702323.html 发现原来还 ...
- Uart,IIC和SPI的区别
1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...
- [terry笔记]11gR2_DataGuard搭建_拷贝数据文件
11gR2搭建dataguard环境: 自己做的实验,后续按照rman模式搭建.主备切换.模式调整等实验会陆续发上来. primary: OS:oel 6.4 database:11.2.0.4.0 ...