基于opencv的人脸识别(适合初学者)

article/2025/10/26 12:44:09

简单易懂的人脸识别,学不会直接跪倒!

一、人脸识别步骤

 二、直接上代码

(1)录入人脸.py

import cv2face_name = 'cjw'  # 该人脸的名字# 加载OpenCV人脸检测分类器
face_cascade = cv2.CascadeClassifier("D:/BaiduNetdiskDownload/python/opencv/opencv-4.5.1/""data/haarcascades/haarcascade_frontalface_default.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()  # 准备好识别方法LBPH方法camera = cv2.VideoCapture(0)  # 0:开启摄像头
success, img = camera.read()  # 从摄像头读取照片
W_size = 0.1 * camera.get(3)  # 在视频流的帧的宽度
H_size = 0.1 * camera.get(4)  # 在视频流的帧的高度def get_face():print("正在从摄像头录入新人脸信息 \n")picture_num = 0  # 设置录入照片的初始值while True:  # 从摄像头读取图片global success  # 设置全局变量global img  # 设置全局变量ret, frame = camera.read()  # 获得摄像头读取到的数据(ret为返回值,frame为视频中的每一帧)if ret is True:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转为灰度图片else:breakface_detector = face_cascade  # 记录摄像头记录的每一帧的数据,让Classifier判断人脸faces = face_detector.detectMultiScale(gray, 1.3, 5)  # gray是要灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighborsfor (x, y, w, h) in faces:  # 制造一个矩形框选人脸(xy为左上角的坐标,w为宽,h为高)cv2.rectangle(frame, (x, y), (x + w, y + w), (255, 0, 0))picture_num += 1  # 照片数加一t = face_namecv2.imwrite("./data/1." + str(t) + '.' + str(picture_num) + '.jpg', gray[y:y + h, x:x + w])# 保存图像,将脸部的特征转化为二维数组,保存在data文件夹内maximums_picture = 13  # 设置摄像头拍摄照片的数量的上限if picture_num > maximums_picture:breakcv2.waitKey(1)get_face()

注意:加载分类器的文件地址;cv2.imwrite:保存图片的路径


(2)数据训练.py        

import os
import cv2
from PIL import Image
import numpy as npdef getlable(path):facesamples = []  # 储存人脸数据(该数据为二位数组)ids = []  # 储存星门数据imagepaths = [os.path.join(path, f) for f in os.listdir(path)]  # 储存图片信息face_detector = cv2.CascadeClassifier('D:/BaiduNetdiskDownload/python/opencv/opencv-4.5.1/data/haarcascades/''haarcascade_frontalface_alt2.xml')  # 加载分类器print('数据排列:', imagepaths)  # 打印数组imagepathsfor imagePath in imagepaths:  # 遍历列表中的图片pil_img = Image.open(imagePath).convert('L')# 打开图片,灰度化,PIL的两种不同模式:# (1)1(黑白,有像素的地方为1,无像素的地方为0)# (2)L(灰度图像,把每个像素点变成0~255的数值,颜色越深值越大)img_numpy = np.array(pil_img, 'uint8')  # 将图像转化为数组faces = face_detector.detectMultiScale(img_numpy)  # 获取人脸特征id = int(os.path.split(imagePath)[1].split('.')[0])  # 获取每张图片的id和姓名for x, y, w, h in faces:  # 预防无面容照片ids.append(id)facesamples.append(img_numpy[y:y+h, x:x+w])# 打印脸部特征和idprint('id:', id)print('fs:', facesamples)return facesamples, idsif __name__ == '__main__':path = 'D:/BaiduNetdiskDownload/python/opencv/pythonProject/face1/data'  # 图片路径faces, ids = getlable(path)  # 获取图像数组和id标签数组和姓名recognizer = cv2.face.LBPHFaceRecognizer_create()  # 获取训练对象recognizer.train(faces, np.array(ids))recognizer.write('trainer/trainer.yml')   # 保存生成的人脸特征数据文件

(3) 进行识别.py

import cv2
import os# 加载训练数据集文件
recogizer = cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')  # 获取脸部特征数据文件
names = []
warningtime = 0def face_detect_demo(img):gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像face_detector = cv2.CascadeClassifier('D:/BaiduNetdiskDownload/python/opencv/opencv-4.5.1/''data/haarcascades/haarcascade_frontalface_default.xml')  # 加载分类器face = face_detector.detectMultiScale(gray, 1.3, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))# 进行识别,把整张人脸部分框起来for x, y, w, h in face: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 = recogizer.predict(gray[y:y + h, x:x + w])  # 进行预测、评分if confidence > 80:global warningtimewarningtime += 1if warningtime > 100:  # 警报达到一定次数,说明不是这个人warningtime = 0cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)else: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)# print('bug:',ids)def name():path = 'D:/BaiduNetdiskDownload/python/opencv/pythonProject/face1/data'imagepaths = [os.path.join(path, f) for f in os.listdir(path)]for imagePath in imagepaths:name1 = str(os.path.split(imagePath)[1].split('.', 2)[1])names.append(name1)cap = cv2.VideoCapture('3.mp4')
name()
while True:flag, frame = cap.read()  # 获得摄像头读取到的数据(flag为返回值,frame为视频中的每一帧)if not flag:breakface_detect_demo(frame)if ord(' ') == cv2.waitKey(10):  # 按空格,退出break
cv2.destroyAllWindows()
cap.release()
# print(names)

三、运行过程及结果

1、获取人脸照片于目标文件中

2、进行数据训练,获得trainer.yml文件中的数据

 

 3.进行识别

        

    

 

 


http://chatgpt.dhexx.cn/article/qj0vvuHW.shtml

相关文章

手把手教你opencv做人脸识别(附源码+文档)

文章目录 一、环境二、使用Haar级联进行人脸检测三、Haar级联结合摄像头四、使用SSD的人脸检测五、 SSD结合摄像头人脸检测六、结语 一、环境 pip install opencv-pythonpython3.9 pycharm2020 人狠话不多,直接上代码,注释在代码里面,不说废…

SIFT算法实现图片匹配

SIFT (Scale-Invariant Feature Transform)是David Lowe 在1999发明的一种算法。它在世界范围内,作为图像对齐和对象识别的参考方法。此方法的鲁棒性能够检测场景的不同比例、角度和照明的因素。silx 中可用的实现使用 OpenCL,这意味着它可以在图形处理单…

SIFT

SIFT features Scale Invariant Feature Transform (SIFT) is an approach for detecting and extracting local feature descriptors that are reasonably invariant to change in illumination, image noise, rotation, scaling, and small changes in viewpoint. SIFT是一…

对SIFT算法的理解,尤其是尺度不变性

SIFT算法四大块 1,尺度空间的建立,最难理解的部分,这一步是为了找到极值点的潜在位置 2,极值点精确定位,通过曲线拟合找到极值点的确切位置 3,分配主方向,为特征点赋予一个方向标志&#xff…

第九章三续:SIFT算法的应用--目标识别之Bag-of-words模型

SIFT算法的应用 -目标识别之用Bag-of-words模型表示一幅图像 作者:wawayu,July。编程艺术室出品。 出处:http://blog.csdn.net/v_JULY_v 。 引言 本blog之前已经写了四篇关于SIFT的文章,请参考九、图像特征提取与匹配…

SIFT算法简介

1、 STFT(Scale Invariant Feature Transform)简介 1.1 SIFT特征检测的步骤1.2 SIFT算法的特点1.3 SIFT算法可以解决的问题 2 、尺度空间 2.1 多分辨率金字塔2.2 高斯金字塔构建示例2.3 高斯尺度空间(使用不同的参数) 3、DoG空间极…

经典算法研究系列:九、图像特征提取与匹配之SIFT算法

经典算法研究系列:九、SIFT算法研究 作者:July、二零一一年二月十五日。 推荐阅读:David G. Lowe, "Distinctive image features from scale-invariant keypoints," International Journal of Computer Vision, 60, 2 (2004), pp. 91-110---…

SIFT算法原理详解

通过《图像局部不变性特征与描述》学习SIFT,遇到各种Issue,总结了这篇博客和另外九篇博客。感谢关注,希望可以互相学习,不断提升。转载请注明链接:https://www.cnblogs.com/Alliswell-WP/p/SIFT.html 如果想深入研究SI…

SIFT算法详解与代码解析

Sift算法详解及代码解析 学了SIFT也有1个半月了,真的是坎坷不断,也因为我可能接触图像邻域时间不长,有很多相关知识要学习,直至今日,才把SIFT大致弄明白。但还有些细节值得去深究,我先把我个人对SIFT算法的…

图像处理——SIFT算法

[SIFT算法原文(Distinctive Image Features from Scale-Invariant Keypoints) SIFT算法(Scale-invariant feature transform),即尺度不变特征变换,由David Lowe提出,是一种基于局部兴趣点的算法,因此不仅对…

特征点匹配——SIFT算法详解

之前在学习三维重建的过程中,了解过SIFT算法,现在老师要求详细的了解SIFT算法,看看能不能对它进行改进,于是又详细的看了一遍SIFT算法。记录一下。 一、SIFT算法综述 SIFT(Scale Invariant Feature Transform&#x…

SIFT算法之python实现

0. 算法原理细节可参考: https://blog.csdn.net/abcjennifer/article/details/7639681https://blog.csdn.net/zddblog/article/details/7521424?depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_sourcedistribute.pc_re…

Python实现SIFT算法,附详细公式推导和代码

SIFT特征点提取算法 1、算法简介 尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David …

图像特征匹配方法——SIFT算法原理及实现

传统图像处理中图像特征匹配有三个基本步骤:特征提取、特征描述和特征匹配。特征提取就是从图像中提取出关键点(或特征点、角点)等。特征描述就是用一组数学向量对特征点进行描述,其主要保证不同的向量和不同的特征点之间是一种对…

SIFT算法原理介绍

本文转自:https://blog.csdn.net/qq_37374643/article/details/88606351 SIFT算法 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 一、SIFT算…

SIFT算法的个人理解

SIFT算法的个人理解——理论篇 1. 前言 本人目前共使用过两个版本的sift算法: (1)Matlab中的sift算法,可以从http://www.cs.ubc.ca/~lowe/keypoints/下载Lowe团队写的sift演示代码; (2)opencv中的sift…

SIFT算法原理解析

首先找到图像中的一些“稳定点”,这些点是一些十分突出的点不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的点,既然两幅图像中有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间…

SIFT算法步骤梳理

简介:SIFT算法是检测和描述局部特征的一种方法,具有尺度不变性,对于光线,噪声等的容忍度相当高。即便少数几个物体也可以产生大量SIFT特征。 SIFT算法实质上是在不同尺度空间上查找关键点,并计算出关键点的方向。 算…

SIFT算法原理详解及代码实现(笔记)

一、SIFT算法概述: SIFT(Scale Invariant Feature Transform)全称尺度不变特征变换,SIFT算子是把图像中检测到的特征点用一个128维的特征向量进行描述,因此一幅图像经过SIFT算法后表示为一个128维的特征向量集&#xf…

SIFT算法 特征匹配

目录 一、SIFT算法DOG尺度空间构造(Difference of Gaussian)关键点搜索与定位方向赋值、关键点描述 二、特征匹配 一、SIFT算法 参考链接 【OpenCV】SIFT原理与源码分析 DOG尺度空间构造(Difference of Gaussian) 首先是对原特…