opencv:从0到实现人脸识别

目录

opencv 人脸检查原理:

整体目录:

1.读取并展示图片

2.人脸检测

3.视频人脸检测

4.拍照保存

5 数据训练

6 人脸识别


opencv 人脸检查原理:

OpenCV 中的人脸检测是基于哈尔特征分类器(Haar Feature-based Cascade Classifiers)的方法。以下是人脸检测的基本原理:

  1. Haar特征: Haar特征是一种基于图像区域的局部特征,通常用于目标检测。这些特征可以是边缘、线、中心化的矩形等。在人脸检测中,Haar特征通常用于检测人脸的各种组成部分,如眼睛、鼻子、嘴巴等。

  2. 分类器: Haar分类器是由许多弱分类器组成的级联结构。每个弱分类器都是一个用于检测特定Haar特征的简单规则。级联结构的目的是通过逐步排除非人脸区域,从而提高检测效率。

  3. 训练: Haar分类器需要进行训练,以便学习正确的人脸和非人脸区域的特征。这个训练过程涉及使用正面人脸样本和负面非人脸样本。

  4. 级联: Haar分类器按照级联方式工作,每个级联阶段都有多个弱分类器。如果图像区域通过了所有级联阶段的检测,那么它被认为是人脸。

  5. 积分图: 为了加速Haar特征的计算,OpenCV使用了积分图(Integral Image)。积分图是对原始图像的一个预处理,使得在任何大小的窗口内计算Haar特征变得更加高效。

  6. 非极大值抑制: 为了避免多次检测同一个人脸,通常使用非极大值抑制(Non-Maximum Suppression)来筛选出具有最高置信度的人脸检测结果。

OpenCV提供了预训练的人脸检测器,其中包括了用于检测人脸的Haar级联分类器。这些分类器可以通过 cv2.CascadeClassifier 进行加载和使用。例如,常见的人脸检测器路径为 cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'。你可以使用这些已经训练好的分类器,也可以根据需要进行训练自己的分类器。

整体目录:

1.读取并展示图片

import cv2 as cv

img = cv.imread('face1.jpg')

# 检查图像是否成功加载
if img is not None:
    # 获取原始图像尺寸
    height, width = img.shape[:2]

    # 缩放图像为原始尺寸的50%
    scaled_img = cv.resize(img, (int(width/4), int(height/4)))

    # 显示缩放后的图像
    cv.imshow('Scaled Image', scaled_img)

    # 等待用户按下任意键后关闭窗口
    cv.waitKey(0)

    # 关闭所有窗口
    cv.destroyAllWindows()
else:
    print("无法加载图像")

2.人脸检测

import cv2 as cv


# 人脸检测函数
def face_detect_demo():
    # 将图像转换为灰度图
    gray = cv.cvtColor(img, cv.COLOR_BGRA2BGR)

    # 加载人脸检测器(使用Haar级联分类器)
    face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')

    # 在灰度图上进行人脸检测
    faces = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    # 遍历检测到的人脸,并在图像上绘制矩形框
    for x, y, w, h in faces:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)

    # 显示结果图像
    cv.imshow('result', img)


# 读取原始图像
org_img = cv.imread('face1.jpg')

# 获取原始图像尺寸
height, width = org_img.shape[:2]

# 缩放图像为原始尺寸的50%
img = cv.resize(org_img, (int(width / 4), int(height / 4)))

# 调用人脸检测函数
face_detect_demo()

# 等待按键输入,按下 'q' 键退出程序
while True:
    if ord('q') == cv.waitKey(0):
        break

# 关闭所有窗口
cv.destroyAllWindows()

 face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') 

这里是本机安装opencv的地方

3.视频人脸检测

import cv2 as cv


# 人脸检测函数
def face_detect_demo(img):
    # 将图像转换为灰度图
    gray = cv.cvtColor(img, cv.COLOR_BGRA2BGR)

    # 加载人脸检测器(使用Haar级联分类器)
    face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')

    # 在灰度图上进行人脸检测
    faces = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    # 遍历检测到的人脸,并在图像上绘制矩形框
    for x, y, w, h in faces:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)

    # 显示结果图像
    cv.imshow('result', img)


# 读取摄像头
cap = cv.VideoCapture(0)



# 等待按键输入,按下 'q' 键退出程序
while True:
    flag,frame = cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord('q') == cv.waitKey(0):
        break

# 关闭所有窗口
cv.destroyAllWindows()

cap.release()

这里调用的是本机笔记本摄像头

4.拍照保存

import cv2

# 打开摄像头(0表示默认摄像头)
cap = cv2.VideoCapture(0)
# 设置标志位和图像编号
flag = 1
num = 1

# 持续捕获摄像头图像并显示
while (cap.isOpened()):
    # 读取摄像头帧
    ret_flag, Vshow = cap.read()

    # 显示摄像头图像
    cv2.imshow("capture_test", Vshow)

    # 检测按键
    k = cv2.waitKey(1) & 0xFF

    # 按下 's' 键保存当前帧为图片
    if k == ord('s'):
        # 保存图像到指定路径,使用编号命名
        cv2.imwrite('C:/Users/14817/Pictures/Screenshots/' + str(num) + "zzq1" + ".jpg", Vshow)
        print("成功保存图片:" + str(num) + ".jpg")
        print("--------------------")
        num += 1
    # 按下空格键退出循环
    elif k == ord(' '):
        break

# 释放摄像头资源
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()

5 数据训练

import os
import cv2
from PIL import Image
import numpy as np


def getImageAndLabels(path):
    faceSamples = []
    ids = []
    # 获取图像目录中所有以指定扩展名结尾的图像文件路径
    imagePaths = [os.path.join(path, f) for f in os.listdir(path) if
                  f.lower().endswith(('.png', '1.jpg', '.jpeg', '.gif', '.bmp'))]

    # 加载人脸检测器(Haar级联分类器)
    face_detector = cv2.CascadeClassifier(
        'D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')

    for imagePath in imagePaths:
        # 使用PIL库打开图像并转换为灰度图
        PIL_img = Image.open(imagePath).convert('L')
        img_numpy = np.array(PIL_img, 'uint8')

        # 使用Haar级联分类器检测图像中的人脸
        faces = face_detector.detectMultiScale(img_numpy)

        # 从图像文件名中提取人物ID
        id = int(os.path.split(imagePath)[1].split('.')[0])

        # 遍历检测到的人脸并保存样本
        for x, y, w, h in faces:
            ids.append(id)
            faceSamples.append(img_numpy[y:y + h, x:x + w])

    # 打印最后一个图像文件的ID、以及所有收集到的人脸样本
    print('id', id)
    print('fs', faceSamples)

    return faceSamples, ids


if __name__ == '__main__':
    # 打印OpenCV版本信息
    print(cv2.__version__)

    # 设置图像目录路径
    path = 'C:/Users/14817/Pictures/Screenshots/'

    # 获取人脸样本和对应的ID
    faces, ids = getImageAndLabels(path)

    # 创建LBPH人脸识别器
    recognizer = cv2.face.LBPHFaceRecognizer_create()

    # 训练人脸识别器
    recognizer.train(faces, np.array(ids))

    # 将训练好的模型保存为YML文件
    recognizer.write("C:/Users/14817/Pictures/Screenshots/trainer.yml")

注意图片名字只能是

1.jpg

或者改代码,需要以数字为名称

6 人脸识别

import cv2
import os

# 创建一个LBPH人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()

# 从文件中加载训练好的人脸识别模型
recognizer.read('C:/Users/14817/Pictures/Screenshots/trainer.yml')

# 存储人物名称的列表
names = []


# 人脸检测及识别函数
def face_detect_demo(img):
    # 将图像转换为灰度
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 加载人脸检测器(Haar级联分类器)
    face_detector = cv2.CascadeClassifier(
        'D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')

    # 检测图像中的人脸
    faces = face_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))

    # 遍历检测到的人脸
    for x, y, w, h in faces:
        # 绘制人脸矩形框
        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 = recognizer.predict(gray[y:y + h, x:x + w])

        # 根据置信度判断是否为未知人物
        if confidence > 80:
            cv2.putText(img, 'unknown', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            # 根据识别出的ID获取人物名称
            cv2.putText(img, str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)

    # 显示结果图像
    cv2.imshow('result', img)


# 用于获取人物名称的函数
def name():
    path = 'C:/Users/14817/Pictures/Screenshots/'
    # 获取图像目录中所有以指定扩展名结尾的图像文件路径
    imagePaths = [os.path.join(path, f) for f in os.listdir(path) if
                  f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]

    # 从文件名中提取人物名称,并添加到names列表中
    for imagePath in imagePaths:
        name = str(os.path.split(imagePath)[1].split('.', 2)[1])
        names.append(name)


# 打开视频文件(可替换为摄像头索引,如0表示默认摄像头)
cap = cv2.VideoCapture('C:/Users/14817/Pictures/Screenshots/1.mp4')
print("start =======")

# 获取人物名称
name()

# 循环读取视频帧并进行人脸识别
while True:
    flag, frame = cap.read()
    if not flag:
        break

    # 调用人脸检测及识别函数
    face_detect_demo(frame)

    # 按空格键退出循环
    if ord(' ') == cv2.waitKey(10):
        break

# 释放内存+关闭视频
cv2.destroyAllWindows()
cap.release()

采用自己录屏几张图片识别,识别到会显示名称,图片名称格式为:1.zzq.jpg

数字+ 名称  + 图片

readme:

1  安装opencv
2  搭建环境  如果引入包失败,记得断开vpn



问题:
AttributeError: module 'cv2' has no attribute 'face'

安装指定版本
pip install opencv-python==4.5.4.58
pip install opencv-contrib-python==4.5.4.58

来源:

【【OpenCV图像处理】只需半天就能搞定人脸识别项目!一个课程学了就会了!附赠源码(python+opencv)】https://www.bilibili.com/video/BV1dT4y1z7it?p=13&vd_source=ecc1a37e826c1af0f62b6e24cdc3af26

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/150792.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EtherCAT从站EEPROM组成信息详解(1):字0-7ESC寄存器配置区

0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 字0-字7ESC寄存器配置区组成信息详解 1.1 ESC寄存器配置区组成规范 对于EtherCAT从站来说,EEPROM的字0-字7组成的ESC寄存器配置区决定了从站上电后ESC能否正常工作…

【React】React-Redux基本使用

容器组件和 UI 组件 所有的 UI 组件都需要有一个容器组件包裹 容器组件来负责和 Redux 打交道,可以随意使用 Redux 的API UI 组件无任何 Redux API 容器组件用于处理逻辑,UI 组件只会负责渲染和交互,不处理逻辑 在我们的生产当中&#xff0…

C/C++最大质数 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C比n小的最大质数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C比n小的最大质数 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 对于给定的n,求比n小的质数中…

零小时零信任:数据标记如何加速实施

现在是零信任的零小时。 虽然这个概念已经存在多年,但现在联邦政府实施它的时间已经紧迫。 拜登政府备忘录被誉为以战斗速度安全交付关键任务数据的解决方案,要求联邦机构在 2024 财年年底前实现具体的零信任安全目标。 此外,国防部正在努…

ClickHouse的数据类型

1 整型 固定长度的整型,包括有符号整型或无符号整型。 整型范围(-2n-1~2n-1-1): Int8 - [-128 : 127] Int16 - [-32768 : 32767] Int32 - [-2147483648 : 2147483647] Int64 - [-9223372036854775808 : 9223372036854775807] 无符…

CSDN每日一题学习训练——Python版(输入起始和结束的正整数,求其两个正整数之间的偶数和、两数相加)

版本说明 当前版本号[20231115]。 版本修改说明20231115初版 目录 文章目录 版本说明目录输入起始和结束的正整数,求其两个正整数之间的偶数和。题目解题思路代码思路参考代码 两数相加题目解题思路代码思路参考代码 输入起始和结束的正整数,求其两个…

P6入门:项目初始化11-项目详情之计算Calculations

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

STM32与ZigBee技术在智能家居无线通信中的应用研究

一、引言 智能家居系统是利用物联网技术将家庭各种设备进行互联互通,实现智能化控制和管理的系统。在智能家居系统中,无线通信技术起着至关重要的作用,而STM32微控制器和ZigBee技术则是实现智能家居无线通信的关键技术。本文将对STM32与ZigB…

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(4)实现寄存器74LS374

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 reg_74LS374.v 1.2 reg_LS3…

VIVADO+FPGA调试记录

vivadoFPGA调试记录 vitis编译vivado导出的硬件平台,提示xxxx.h file cant find vitis编译vivado导出的硬件平台,提示’xxxx.h file cant find’ 此硬件平台中,包含有AXI接口类型的ip。在vitis编译硬件平台时,经常会报错&#xf…

Docker Compose详细教程(从入门到放弃)

对于现代应用来说,大多都是通过很多的微服务互相协同组成的一个完整应用。例如, 订单管理、用户管理、品类管理、缓存服务、数据库服务等,它们构成了一个电商平台的应 用。而部署和管理大量的服务容器是一件非常繁琐的事情。而 Docker Compos…

WordPress 媒体库文件夹管理插件 FileBird v5.5.4和谐版下载

FileBird是一款WordPress 按照文件夹管理方式的插件。 拖放界面 拖放功能现已成为现代软件和网站的标配。本机拖动事件(包括仅在刀片中将文件移动到文件夹以及将文件夹移动到文件夹)极大地减少了完成任务所需的点击次数。 一流设计的文件夹树展示 我们…

如何下载 Apache + PHP + Mysql 集成安装环境并结合内网穿透工具实现公网访问内网服务

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. WampServer下载安装二. WampServer启动三. 安装cpolar内网穿透3.1 注册账号…

2023年09月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 阅读以下代码,程序输出结果正确的选项是?( ) def process_keywords(keywords_list):unique_keywords = list(set(keywords_list))

Day31力扣打卡

打卡记录 由子序列构造的最长回文串的长度&#xff08;区间DP&#xff09; 先将两个字符串合并&#xff0c;再仿照 最长回文子序列 的做法&#xff0c;从中间开始往外进行遍历&#xff0c;由于是两个字符串&#xff0c;在 最长回文子序列 的做法上需要满足 len(word1) < j …

《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS

title: 《网络协议》06. HTTP 补充 HTTPS SSL/TLS date: 2022-10-06 18:09:55 updated: 2023-11-15 07:53:52 categories: 学习记录&#xff1a;网络协议 excerpt: HTTP/1.1 协议的不足、HTTP/2、HTTP/3、HTTP 协议的安全问题、SPDY、HTTPS、SSL/TLS、OpenSSL。 comments: fa…

力扣刷题篇之数与位2

系列文章目录 目录 系列文章目录 前言 数值计算 总结 前言 本系列是个人力扣刷题汇总&#xff0c;本文是数与位。刷题顺序按照[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09; 数值计算 415. 字符串相加 - 力扣&#xff08;…

Android studio配置Flutter开发环境报错问题解决

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 报错问题截图 报错原因已经给出&#xff1a; You need Java 11 or higher to build your app with this version of G…

C#中.NET Framework4.8 Windows窗体应用通过EF访问新建数据库

目录 一、 操作步骤 二、编写EF模型和数据库上下文 三、 移植&#xff08;Migrations&#xff09;数据库 四、编写应用程序 五、生成效果 前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 本文想说的是&#xff0c;.NET Framework4.8 Win…

把大模型装进手机,总共分几步?

年初ChatGPT爆火的时候&#xff0c;我去上海参加华为春季新品发布会&#xff0c;用一页keynote提到了大模型技术与手机硬件的结合。虽然只有短短的一两分钟&#xff0c;但我专门发了一条朋友圈&#xff0c;看好自然语言交互能力在手机上的应用。 当时我就有预感&#xff0c;大语…