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答题.比之前的游戏好 ...
- 微信小程序开发系列五:微信小程序中如何响应用户输入事件
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
随机推荐
- 有关马氏距离和hinge loss的学习记录
关于度量学习,之前没有看太多相关的文献.不过南京的周老师的一篇NIPS,确实把这个问题剖析得比较清楚. Mahalanobis距离一般表示为d=(x-y)TM(x-y),其中x和y是空间中两个样本点, ...
- 一、数组---数组中的K-diff数对※※※※※
给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k ...
- BZOJ 2342 [Shoi2011]双倍回文(manacher+堆+set)
题意 N<=500000 题解 维护一个set可以用堆来解决. #include<iostream> #include<cstring> #include<cstd ...
- You Probably Don’t Need a Message Queue
原文地址 I’m a minimalist, and I don’t like to complicate software too early and unnecessarily. And addi ...
- wordcontent结对编程
合作者:201631062625 201631062127 代码地址:https://gitee.com/yzpdegit/ts 本次作业链接:https://www.cnblogs.com/yang ...
- linux 空间不够了 修改 /boot
1> 查看空间多少:df -h2> 查看当期内核: uname -r3> 查找内核 rpm -qa | grep kernel4> 删除多余的内核 yum remo ...
- 2015 Multi-University Training Contest 1 hdu 5290 Bombing plan
Bombing plan Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
- 洛谷 P2183 巧克力
P2183 巧克力 题目描述 佳佳邀请了M个同学到家里玩.为了招待客人,她需要将巧克力分给她的好朋友们.她有N(1<=N<=5000)块巧克力,但是大小各不一样,第i块巧克力大小为为1*X ...
- 洛谷 P2818 天使的起誓
P2818 天使的起誓 题目描述 Tenshi非常幸运地被选为掌管智慧之匙的天使.在正式任职之前,她必须和其他新当选的天使一样要宣誓.宣誓仪式是每位天使各自表述自己的使命,他们的发言稿放在n个呈圆形排 ...
- [React] Refactor a Stateful List Component to a Functional Component with React PowerPlug
In this lesson we'll look at React PowerPlug's <List /> component by refactoring a normal clas ...