人脸识别三部曲

news2024/9/24 3:26:37

人脸识别三部曲

  • 首先看目录结构
  • 图像信息采集 采集图片.py
  • 模型训练 训练模型.py
  • 人脸识别 人脸识别.py
    • 效果

首先看目录结构

引用文121本

opencv
│   采集图片.py  
│    训练模型.py
│   人脸识别.py
│
└───trainer
│   │   trainer.yml
│   
└───data
│   └───00_Wang
│       │   0_00001.jpg
│       │   0_00002.jpg
│       │   ...
│       
│   └───01_Liu
│       │   1_00001.jpg
│       │   1_00001.jpg
│       │   ...
│    

图像信息采集 采集图片.py

开始运行时,输入待录入的人脸姓名。 按下s键后,开始录入人脸图像,录入两百张后,结束程序。

import cv2
import shutil
import os
"采集图片.py  "
path = "./data/"
file_num = len(os.listdir(path))

name = input('input name:\n')
name_dir = os.path.join(path,str(file_num).zfill(2)+ "_"+name)
if os.path.exists(name_dir): # 存在则清空,不存在则重建
    shutil.rmtree(name_dir)
os.makedirs(name_dir)

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')

count = 0

while cap.isOpened():
    ret, frame = cap.read()
    if ret is True:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray, 1.3, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + w), (255, 0, 0))
        cv2.imshow('image', frame)

        k = cv2.waitKey(1) & 0xFF  # 按键判断
        if (k == ord('s')):  # 保存
            count += 1
            cv2.imwrite(name_dir + "/" + str(file_num) + "_" + str(count).zfill(5) + ".jpg", gray)
            print("success to save  " + str(file_num) + "_" + str(count).zfill(5) + ".jpg")
        elif count >= 200:
            break
        elif k == ord(' '):  # 退出
            break

cap.release()
cv2.destroyAllWindows()

模型训练 训练模型.py

import os
import cv2
import numpy as np
from PIL import Image
" 训练模型.py "
path = "./data/"
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')

def get_images_and_labels(path):
    image_paths = []
    name_dirs = [os.path.join(path, f) for f in os.listdir(path)]
    for i in range(0, len(name_dirs) ):
        print("name_dirs[{0}] : ".format(i) , name_dirs[i])
        image_paths += [os.path.join(name_dirs[i], f) for f in os.listdir(name_dirs[i])]

    face_samples = []
    ids = []

    for image_path in image_paths:
        img = Image.open(image_path).convert('L')
        img_np = np.array(img, 'uint8')
        if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
            continue

        id = int((os.path.split(image_path)[-1].split(".")[0])[0])
        faces = detector.detectMultiScale(img_np)

        for (x, y, w, h) in faces:
            face_samples.append(img_np[y:y + h, x:x + w])
            ids.append(id)
    return face_samples, ids

faces, ids = get_images_and_labels(path)
recognizer.train(faces, np.array(ids))
recognizer.save('trainer/trainer.yml')

人脸识别 人脸识别.py

import cv2
import os
"人脸识别.py "
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
font = cv2.FONT_HERSHEY_SIMPLEX
idnum = 0

cam = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cam.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))
minW = 0.1 * cam.get(3)
minH = 0.1 * cam.get(4)


path = "./data/"
names = []
for name in os.listdir(path):
    names.append(name.split("_")[1])
    print(names)


while True:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.2,
        minNeighbors=5,
        minSize=(int(minW), int(minH))
    )
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w])

        if confidence < 80:
            idum = names[idnum-1]
            confidence = "{0}%".format(round(100 - confidence))
        else:
            idum = "unknown"
            confidence = "{0}%".format(round(100 - confidence))

        cv2.putText(img, str(idum), (x + 5, y - 5), font, 1, (0, 0, 255), 1)
        cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)

        cv2.imshow('camera', img)

    k = cv2.waitKey(1) & 0xFF  # 按键判断
    if k == ord(' '):  # 退出
        break

cam.release()
cv2.destroyAllWindows()

效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何把VRTE的应用程序在Ubuntu上跑起来?

1、rvbuild -d project_name 20 产生一个文件夹vrte 如果此时直接将vrte文件夹打包放到Ubuntu的 /opt目录内 执行./opt/vrte/usr/bin/exmd.sh 会出现如下错误&#xff1a; 但是查看文件发现这个文件是存在的。 系统找不到文件是因为找不到对应的ld库 从VRTE里面拷贝一个库…

css动画旋转分层旋转图

1.代码 <template><view class"animations"><view class"animation animation1"><view class"animate1"></view><view class"animate2"></view><view class"animate3">&l…

九鼎开发板Uboot开发问题——sd_fusing运行异常

在学习朱有鹏老师的嵌入式Linux——Uboot移植&#xff0c;运行sd_fusing.sh脚本出现mkfs.fat命令参数问题&#xff0c;一直提示"No device specified." 脚本内容&#xff1a; # # Copyright (C) 2010 Samsung Electronics Co., Ltd. # http://www.sams…

多目标优化算法:基于非支配排序的霸王龙优化算法(NSTROA)MATLAB

一、霸王龙优化算法 霸王龙优化算法&#xff08;Tyrannosaurus optimization&#xff0c;TROA&#xff09;由Venkata Satya Durga Manohar Sahu等人于2023年提出&#xff0c;该算法模拟霸王龙的狩猎行为&#xff0c;具有搜索速度快等优势。 霸王龙属于暴龙超科的暴龙属&#…

粘连物体分割

threshold-全局固定阈值分割 Binary Threshold-自动全局阈值分割 dyn_threshold-局部动态阈值分割 var_threshold算子-均值和标准偏差局部阈值分割 dual_threshold-双重阈值分割&#xff08;有符号图像的阈值算子&#xff09; auto_threshold-自动全局阈值分割 fast_threshold-…

Java面试_并发编程_线程基础

Java面试_并发编程_线程基础 线程基础线程和进程的区别(出现频率: 3⭐)并行和并发的区别(出现频率: 2⭐)线程的创建(出现频率: 4⭐)线程的状态(出现频率: 4⭐)让线程按顺序执行(出现频率: 3⭐)notify()和notifyAll()有什么区别(出现频率: 2⭐)wait方法和sleep方法的区别(出现频…

Ubuntu下 Docker、Docker Compose 的安装教程

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 Docker Compose是用于定义…

springboot班级综合测评管理系统springboot005

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

优思学院|六西格玛与敏捷管理两者有何不同?

如果你正在寻找提高组织流程和降低缺陷或错误的方法&#xff0c;六西格玛和敏捷是两种你可能会考虑的方法。这两种方法有着不同的重点和应用领域。在这篇文章中&#xff0c;我们将深入研究六西格玛和敏捷&#xff0c;并探讨它们之间的差异。 什么是六西格玛&#xff1f; 六西…

MySQL数据库索引优化难点与面试点

MySQL数据库索引优化难点与面试点 什么是MySQL索引&#xff1f; 索引的MySQL官方定义&#xff1a;索引是帮助MySQL快速获取数据的数据结构。 动力节点原文&#xff1a; MysQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。 MysQL在存储数据之外&#xff0c;数据…

Qt5开发及实例V2.0-第二章Qt模板库工具类及控件

Qt5开发及实例V2.0-第二章Qt模板库工具类及控件 第2章 Qt 5模板库、工具类及控件2.1 字符串类2.1.1 操作字符串2.1.2 查询字符串数据2.1.3 字符串的转换 2.2 容器类2.2.1 QList类、QLinkedList类和QVector类2.2.2 QMap类和QHash类 2.3 QVariant类2.4 算法及正则表达式2.4.1 Qt …

Spring编程常见错误50例-Spring Bean依赖注入常见错误(下)

Value没有注入预期的值 问题 对于Value可以装配多种类型的数据&#xff1a; 装配对象&#xff1a; Value("#{student}") private Student student;Bean public Student student(){Student student createStudent(1, "xie");return student; }装配字符…

【Nuxt3】Vue3 + Element-plus 打包后报错 @popperjs/core

问题&#xff1a; 更新 Element-plus 后&#xff0c;运行时需要安装 popperjs/core 依赖。 如果正常执行 npm install popperjs/core &#xff0c;那么&#xff0c;打包时&#xff0c;就会出现下面报错。 Named export ‘placements’ not found. The requested module ‘poppe…

Python | 为FastAPI后端服务添加API Key认证(分别基于路径传参和header两种方式且swagger文档友好支持)

文章目录 01 前言02 路径传参方式添加API Key2.1 完整代码2.2 请求示例2.3 swagger文档测试 03 请求头Header方式传入API Key&#xff08;推荐&#xff09;3.1 完整代码3.2 请求示例3.3 swagger文档测试 01 前言 FastAPI&#xff0c;如其名所示&#xff0c;是一个极为高效的框…

云计算的未来:云原生架构和自动化运维的崭露头角

文章目录 云计算的演进云原生架构1. 容器化2. 微服务3. 自动化部署和扩展4. 故障恢复 自动化运维1. 基础设施即代码&#xff08;IaC&#xff09;2. 运维自动化示例&#xff1a;使用Ansible自动化配置管理 3. 自动化监控和报警 未来展望1. 更多的自动化2. 多云混合云3. 边缘计算…

华为+苹果的“科技春晚”背后,“自主创新+实在技术”遥遥领先!

过去的24小时里&#xff0c;科技春晚迎来“双主角”&#xff1a;12日下午&#xff0c;华为发布会&#xff0c;13日凌晨&#xff0c;苹果发布会。 尽管苹果一向以其创新和高端的形象而闻名&#xff0c;但与昔日苹果发布会后有关新品的词条霸屏微博热搜不同&#xff0c;当天在发…

初步了解华为的MTL(市场到线索)流程的基本概念和来龙去脉

前两天&#xff0c;有读者给华研荟发私信&#xff0c;说在学习华为资料的时候看到华为有一个MTL流程&#xff0c;想了解下这个MTL流程和LTC流程有什么区别&#xff1f;既然有了LTC流程&#xff0c;为什么还要MTL流程呢&#xff1f; 为此&#xff0c;今天华研荟给大家简要介绍华…

让电子制造厂提高生产率的方法,学会受用终生!

在现代工业领域&#xff0c;工厂的生产运营离不开复杂的设备和关键的基础设施。然而&#xff0c;工厂在日常运营中常常面临着各种风险&#xff0c;其中之一就是水浸事件。 水浸监控不仅仅是一种反应性的措施&#xff0c;更是一种预防性的安全策略。通过使用高度先进的传感技术和…

前端使用H5中draggable实现拖拽排序效果 两种实现效果

文章目录 一、实现效果①1、实现代码2、效果演示 二、实现效果②1.实现代码2.效果演示 一、实现效果① 将一个节点拖到另一个节点之前或之后 1、实现代码 <!DOCTYPE html> <style>* {padding: 0;margin: 0;}body {display: flex;width: 100%;height: 100vh;just…

Matlab中关于 : 的使用

设&#xff0c;mat 这个矩阵的规格是 n*m&#xff0c;temp mat( i , j ) 矩阵的行和列的下标从1开始 在这个矩阵中&#xff0c;a:b 代表的含义是范围是从 a--b 则&#xff0c;当 a 和 b 被省略时&#xff0c;代表的范围就是最大范围&#xff08;1--n&#xff09; or &#…