python基于opencv和tkinter实现人脸识别【内附完整代码】

这篇具有很好参考价值的文章主要介绍了python基于opencv和tkinter实现人脸识别【内附完整代码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

人脸识别技术已经在许多领域得到了广泛应用,例如安防、金融、医疗等等。人脸识别可以帮助我们识别和验证一个人的身份,这是一项非常重要的任务。本篇博客将介绍如何使用Python和OpenCV库进行人脸识别。我们将学习如何使用OpenCV中的人脸检测器检测图像中的人脸,如何与一个人的图像进行比较以检测是否属于该人,以及如何在GUI中显示识别结果。你可以嵌入到你的程序、机器上。现在,让我们开始学习人脸识别技术吧!

如果你已有python环境和opencv库可直接跳转到代码解读


目录

前言:

环境搭建:

安装Python

安装pip

安装OpenCV

配置环境变量

代码解读

程序的大体流程如下:

加载 Haar Cascade 分类器用于人脸检测。

打开摄像头并捕获实时图像。

循环处理捕获的图像:

关闭摄像头并销毁窗口。

代码解析

与person文件夹中的图像进行比较以检测人脸

 cv2AddChineseText方法

 完整代码


环境搭建:

安装Python

首先,你需要下载和安装Python。可以在Python官方网站上下载最新版本的Python安装程序:https://www.python.org/downloads/windows/请务必下载并安装3.x版本的Python,因为OpenCV不支持Python 2.x。

安装pip

pip是Python的包管理器,可以轻松地安装、升级和删除Python软件包。可以使用以下命令检查是否已经安装了pip:

pip --version

 如果pip没有安装,可以在终端中输入以下命令进行安装:

python -m ensurepip --default-pip

安装OpenCV

可以使用pip来安装OpenCV:

pip install opencv-python

配置环境变量

为了让Python能够找到OpenCV,需要将OpenCV的路径添加到系统的环境变量中。

首先,找到OpenCV安装的路径,一般在Python的安装目录下的Lib\site-packages目录中。例如,在我的电脑上,OpenCV安装在以下目录下:

C:\Users\username\AppData\Local\Programs\Python\Python39\Lib\site-packages\cv2

然后,将这个路径添加到系统的环境变量中。在Windows 10中,可以按以下步骤进行操作:

  1. 在Windows搜索栏中输入“环境变量”,并点击“编辑系统环境变量”;
  2. 在“高级”选项卡下,点击“环境变量”按钮;
  3. 在“系统变量”下方找到“Path”变量,点击“编辑”按钮;
  4. 在“编辑环境变量”对话框中,点击“新建”按钮,并将OpenCV的路径添加进去。
  5. 测试OpenCV
  6. 最后,可以测试一下OpenCV是否已经正确安装。可以在终端中输入以下代码:
import cv2 
print(cv2.__version__)

如果OpenCV已经成功安装,应该会显示OpenCV的版本号。

希望这个简要的教程可以帮助你在Windows上成功安装和配置OpenCV和Python。

代码解读

这是一个基于 OpenCV 库和 tkinter 库开发的人脸识别程序。它可以从摄像头实时获取视频,并在视频中检测人脸并显示其姓名。

程序的大体流程如下:

  1. 加载 Haar Cascade 分类器用于人脸检测。

  2. 打开摄像头并捕获实时图像。

  3. 循环处理捕获的图像:

    1. 将图像转换为灰度图像。
    2. 使用 Haar Cascade 分类器检测人脸。
    3. 如果检测到人脸,则查找是否存在与 person 文件夹中的某个人匹配的图像。
    4. 如果找到匹配的人脸,则在图像中框出人脸并显示姓名。
    5. 如果未找到匹配的人脸,则在图像中框出人脸但不显示姓名。
    6. 将图像转换为 PIL Image 格式以在 GUI 中显示。
    7. 更新标签以显示图像。
    8. 处理 GUI 事件以避免程序挂起。
  4. 关闭摄像头并销毁窗口。

代码中的函数 cv2AddChineseText 用于在图像上添加中文文本。函数 cv2AddChineseText 接受四个参数:

  • img:要添加文本的图像。
  • text:要添加的文本。
  • position:文本的位置。
  • textColor:文本颜色,默认为绿色。
  • textSize:文本大小,默认为 30。

代码中的 person_images 列表用于存储 person 文件夹中的人脸图像。person_names 列表用于存储每个人脸图像对应的姓名。在处理捕获的图像时,程序将检查每个人脸图像是否匹配,并在图像中显示姓名。

代码解析

该程序主要通过计算机视觉技术实现人脸识别。首先,程序使用OpenCV库中的Haar Cascade分类器来检测输入图像中的人脸。然后,它会将人脸与事先保存在“person”文件夹中的图像进行比较,以确定是否存在匹配的人脸。如果存在匹配的人脸,则程序会在图像中框出人脸并显示相应的姓名。如果不存在匹配的人脸,则程序仅在图像中框出人脸。

下面是程序的主要部分的解释:

# 加载Haar Cascade分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 打开摄像头并捕获实时图像
cap = cv2.VideoCapture(0)

# 读取person文件夹中的图像和姓名
person_images = []
person_names = []
for filename in os.listdir('person'):
    if filename.endswith('.jpg'):
        # 使用utf-8编码打开文件
        with open(os.path.join('person', filename), 'rb') as f:
            person_images.append(cv2.imdecode(np.frombuffer(f.read(), np.uint8), cv2.IMREAD_COLOR))
        person_names.append(os.path.splitext(filename)[0])

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 转换图像格式以进行人脸检测
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 使用Haar Cascade分类器检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    # 在图像中框出检测到的人脸
    for (x, y, w, h) in faces:
        # 检查人脸是否属于person文件夹中的某个人
        found_person = False
        for i in range(len(person_images)):
            person_image = person_images[i]
            person_name = person_names[i]
            # 将person图像转换为灰度图像以进行比较
            person_gray = cv2.cvtColor(person_image, cv2.COLOR_BGR2GRAY)
            # 检查是否存在与person图像相匹配的人脸
            match = cv2.matchTemplate(gray[y:y + h, x:x + w], person_gray, cv2.TM_CCOEFF_NORMED)
            if match.max() > 0.8:
                # 如果找到匹配的人脸,则将其标记为“found_person”,并绘制人脸框
                found_person = True
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
                # 在人脸框上方写出人名
                cv2.putText(frame, person_name, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
                break
        if not found_person:
            # 如果没有找到匹配的人脸,则将其标记为“unknown”,并绘制人脸框
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
            cv2.putText(frame, 'unknown', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)

          

与person文件夹中的图像进行比较以检测人脸

我们已经成功地检测出了人脸,并将其框出来。现在我们将探讨如何与person文件夹中的图像进行比较以检测人脸。

首先,我们需要读取person文件夹中的图像和姓名。我们可以使用os模块中的listdir函数列出person文件夹中的所有文件名,然后使用cv2.imread函数读取每个图像。

import os

person_folder = 'person'
person_images = []
person_names = []

# 获取person文件夹中的所有文件名
for filename in os.listdir(person_folder):
    # 如果文件名以'.jpg'或'.png'结尾,则读取该图像并将其添加到person_images列表中
    if filename.endswith('.jpg') or filename.endswith('.png'):
        image = cv2.imread(os.path.join(person_folder, filename))
        person_images.append(image)
        # 使用文件名中的数字作为该人员的姓名
        person_names.append(filename.split('.')[0])

接下来,我们需要将每个person图像转换为灰度图像以进行比较。我们可以使用cv2.cvtColor函数将BGR图像转换为灰度图像。

for i in range(len(person_images)):
    person_image = person_images[i]
    # 将person图像转换为灰度图像以进行比较
    person_gray = cv2.cvtColor(person_image, cv2.COLOR_BGR2GRAY)

现在,我们可以使用matchTemplate函数将当前人脸与person图像进行比较,以确定当前人脸是否属于person文件夹中的某个人。matchTemplate函数可以将当前人脸的灰度图像与person图像的灰度图像进行比较,并返回一个相似度矩阵。我们可以使用max方法获取相似度矩阵中的最大值,并将其与一个预设的阈值(例如0.8)进行比较,以确定当前人脸是否与person图像匹配。 

    for (x, y, w, h) in faces:
        # 检查人脸是否属于person文件夹中的某个人
        found_person = False
        for i in range(len(person_images)):
            person_image = person_images[i]
            person_name = person_names[i]
            # 将person图像转换为灰度图像以进行比较
            person_gray = cv2.cvtColor(person_image, cv2.COLOR_BGR2GRAY)
            # 检查是否存在与person图像相匹配的人脸
            match = cv2.matchTemplate(gray[y:y + h, x:x + w], person_gray, cv2.TM_CCOEFF_NORMED)
            if match.max() > 0.8:
                found_person = True
                # 将人物名称绘制在检测到的人脸上
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
                cv2.putText(frame, person_name, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
                break

        # 如果找不到相应的人物,则将“Unknown”绘制在检测到的人脸上
        if not found_person:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
            cv2.putText(frame, 'Unknown', (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        
    # 将帧显示在窗口中
    cv2.imshow('Face Recognition', frame)
    
    # 等待退出键
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

这段代码将每个检测到的人脸与存储在“person”文件夹中的图像进行比较。如果存在与任何一个图像匹配的人脸,则在该人脸上方框和标注该人的名称。否则,将该人脸框在红色方框内,并标注“Unknown”。(完整代码中没有加入这行,如果需要可以加上)

最后,它将帧显示在GUI窗口中,并等待退出键按下后释放资源并关闭窗口。

 cv2AddChineseText方法

在原生的cv2.putText()方法里并不支持中文只能显示英文,在网上查阅了很多方法都不奏效于是我决定重构这个方法:

def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype(
        "simsun.ttc", textSize, encoding="utf-8")
    # 绘制文本
    draw.text(position, text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

 完整代码

import cv2
import os
import tkinter as tk
from PIL import Image, ImageTk,ImageDraw
import numpy as np

from PIL import ImageFont

def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype(
        "simsun.ttc", textSize, encoding="utf-8")
    # 绘制文本
    draw.text(position, text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

# 加载自定义字体
font = ImageFont.truetype(r"C:\Users\ge\Desktop\test1\Cuesor\msyh.ttc", size=30)

# 加载Haar Cascade分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 创建GUI窗口
root = tk.Tk()
root.geometry('640x480')
root.title('人脸识别')

# 创建标签用于显示图像
image_label = tk.Label(root)
image_label.pack()

# 打开摄像头并捕获实时图像
cap = cv2.VideoCapture(0)

# 创建 PhotoImage 对象
photo = None

# 读取person文件夹中的图像和姓名
person_images = []
person_names = []
for filename in os.listdir('person'):
    if filename.endswith('.jpg'):
        # 使用utf-8编码打开文件
        with open(os.path.join('person', filename), 'rb') as f:
            person_images.append(cv2.imdecode(np.frombuffer(f.read(), np.uint8), cv2.IMREAD_COLOR))
        person_names.append(os.path.splitext(filename)[0])


# 循环处理摄像头捕获的图像
while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 转换图像格式以进行人脸检测
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 使用Haar Cascade分类器检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    # 在图像中框出检测到的人脸
    for (x, y, w, h) in faces:
        # 检查人脸是否属于person文件夹中的某个人
        found_person = False
        for i in range(len(person_images)):
            person_image = person_images[i]
            person_name = person_names[i]
            # 将person图像转换为灰度图像以进行比较
            person_gray = cv2.cvtColor(person_image, cv2.COLOR_BGR2GRAY)
            # 检查是否存在与person图像相匹配的人脸
            match = cv2.matchTemplate(gray[y:y + h, x:x + w], person_gray, cv2.TM_CCOEFF_NORMED)
            if match.max() > 0.8:
                print(person_name)
                found_person = True
                # 在图像中框出人脸并显示姓名
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
                # 在图像中框出人脸并显示姓名
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
                frame = cv2AddChineseText(frame, person_name, (x + (w/2)-10, y - 30), (0, 255, 255), 30)
                break

        # 如果没有找到匹配的人脸,则在图像中框出人脸但不显示姓名
        if not found_person:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # 将图像转换为PIL Image格式以在GUI中显示

    image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    photo = ImageTk.PhotoImage(image)

    # 更新标签以显示图像
    image_label.configure(image=photo)
    image_label.image = photo

    # 处理GUI事件以避免程序挂起
    root.update()
#关闭摄像头并销毁窗口
cap.release()
cv2.destroyAllWindows()

人脸识别技术在现代生活中有着广泛的应用,例如人脸解锁手机、人脸识别支付、安防领域等。但是,人脸识别技术还存在一些局限性和改进的空间。

首先,人脸识别技术的准确性受到许多因素的影响,例如光照、姿势、表情、遮挡等。为了提高人脸识别的准确性,可以采用更先进的算法,例如基于深度学习的人脸识别算法。此外,还可以通过采用更好的硬件设备来提高图像采集的质量。

其次,当前的人脸识别技术主要针对单个人脸进行识别,对于多个人脸的情况处理较为困难。为了解决这个问题,可以探索如何将多个人脸的特征进行有效地提取和匹配。

最后,人脸识别技术还涉及到隐私保护等伦理问题。在应用人脸识别技术时,需要注意隐私保护的问题,避免对个人隐私造成侵害。

总的来说,人脸识别技术在未来还有很大的发展空间,随着科技的不断进步,相信人脸识别技术的应用将更加广泛,也将更加普及化和便利化。

人脸识别技术正在广泛应用于各个领域,例如安全监控、人脸支付、人脸解锁等等。本文介绍的人脸识别应用程序只是冰山一角,随着技术的不断发展,我们可以期待更加高效、准确的人脸识别应用程序的出现。如果您对人脸识别技术感兴趣,不妨关注相关的技术发展和应用案例,为您的职业生涯增添一份技术的底气。感谢阅读本文,如果您觉得有用,请点赞、收藏和关注,谢谢啦!!

过几天我会在此基础上加上录入人脸信息的功能,感兴趣的小伙伴不要错过哦。

再次感谢不离不弃的粉丝,之后仍会不定期更新哦~~

 文章来源地址https://www.toymoban.com/news/detail-412928.html

到了这里,关于python基于opencv和tkinter实现人脸识别【内附完整代码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用OpenCV工具包成功实现人脸检测与人脸识别,包括传统视觉和深度学习方法(附完整代码,吐血整理......)

    要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操作。 参考链接: 1、OpenCV人脸检测 2、【OpenCV-Python】32.OpenCV的人脸检测和识别——人脸检测 3、【youcans 的图像处理学习课】23. 人脸检测:Haar 级联检测器 4、OpenCV实战5:LBP级联分类器

    2024年02月12日
    浏览(46)
  • 基于OpenCV提供的人脸识别算法LBPH实现人脸识别

    本文通过学习LBPH人脸识别算法,简要了解人脸识别技术的原理,实现人脸采集、训练人脸模型实现人脸识别。 OpenCV库自带的人脸级联分级器具有很好的人脸检测和人脸追踪效果,它是一个基于Haar特征的Adaboost级联分类器。特别注意,OpenCV库虽然自带人脸级联分级器,但是识

    2024年02月03日
    浏览(47)
  • 基于树莓派和opencv实现人脸识别

    源码我放在github上了 https://github.com/FjnuThomas/-opencv- 各位哥哥姐姐clone代码别忘了给个小心心哦😘 前言 一、人脸检测 二、图像采集 三、开始训练 四、人脸识别 总结 我们这学期选修了一门嵌入式Linux,期末选择了基于树莓派和opencv实现人脸识别作为期末作业。为了展示的方便

    2023年04月23日
    浏览(44)
  • 基于MFC和OpenCV实现人脸识别

    笔记主要参考B站视频“【C语言项目】软件开发:人脸识别”。 项目原理速览查看B站视频“【学习笔记】基于OpenCV实现人脸识别的原理讲解”。 可能会用到的资料有如下所示,下载链接见文末: 《奇牛编程-人脸识别资料》 1 ,但是其中有一些命名错误可能会导致程序调用失

    2024年02月07日
    浏览(44)
  • 基于 OpenCV + Python 的人脸识别上课签到系统

    目录 前言 安装第三方库 第一步:采集人脸图像 (1)修改姓名学号 (2)运行capture_face.py  (3)采集人脸图像  (4)查看采集到的人脸图像 第二步:训练模型 第三步:识别签到 (1)建立签到表 (2)运行sign_in.py,进行签到 (3)查看签到结果 第四步:设计GUI 完整项目的

    2024年02月04日
    浏览(47)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 一、简单介绍 二、简单进行人脸训练与识别 1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别 2、实现步骤: 3、判断是谁的人脸: 案例中涉及的关键函数说

    2024年04月26日
    浏览(92)
  • Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

    ​ 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用,主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术,其中包括以下几个关键步骤: 图像预处理 :首先,对输入图像进行预处理,包括读取图片、将图片灰度转换、修改图片的尺寸、绘制矩形

    2024年04月13日
    浏览(70)
  • 人工智能-OpenCV+Python实现人脸识别(人脸检测)

    在OpenCV中使用Haar特征检测人脸,那么需要使用OpenCV提供的xml文件(级联表)在haarcascades目录下。这张级联表有一个训练好的AdaBoost训练集。首先要采用样本的Haar特征训练分类器,从而得到一个级联的AdaBoost分类器。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征

    2024年02月06日
    浏览(104)
  • 基于OpenCv和tensorflow的人脸识别设计与实现

    项目名称: 基于OpenCv和tensorflow的人脸识别 项目地址:https://gitee.com/yq233/opencv 环境配置: Python tensorflow2 OpenCv categories: 人工智能 description: Opencv是一个开源的的跨平台计算机视觉库,内部实现了图像处理和计算机视觉方面的很多通用算法,对于python而言,在引用opencv库的时候需要

    2024年02月03日
    浏览(48)
  • 基于python-opencv,svm的开源人脸识别项目

      前言       本项目是我自己在学校里完成的一个小项目,本项目为基于python-opencv,svm的人脸识别开源项目,不同于其他的直接从kaggle等获取划分好的数据集,本项目致力于从无到有的完成机器学习的所有步骤,即: 目录 项目展示: 一、数据采集 1.创建爬虫项目 2.修改set

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包