使用 Python 和 OpenCV 进行面部识别 – 应用于监控、人脸门禁和考勤等

使用 Python 和 OpenCV 进行面部识别 – 应用于监控、人脸门禁和考勤等在本文中 我们探索 OpenCV 和 Python 在创建强大的人脸识别系统方面的巨大潜力 使用 imshow 函数显示捕获的图像

大家好,欢迎来到IT知识分享网。

在本文中,我们探索 OpenCV 和 Python 在创建强大的人脸识别系统方面的巨大潜力。从而逐步实现识别图像和视频中的人脸的整个过程。凭借清晰的解释和实际示例,希望您深入了解计算机视觉和人脸识别。

使用 Python 和 OpenCV 进行面部识别 - 应用于监控、人脸门禁和考勤等

下载 OpenCV 库

访问官网进行下载并安装: https://opencv.org/

pip install opencv-python
使用 Python 和 OpenCV 进行面部识别 - 应用于监控、人脸门禁和考勤等

安装完成之后我们可以在文件夹下看到这些文件sources/data/haarcascades

使用 Python 和 OpenCV 进行面部识别 - 应用于监控、人脸门禁和考勤等

包含了强大的识别算法,如眼睛识别和面部识别

人脸检测报警系统(可用于:家庭监控、人脸门禁、人脸考勤等)

抓拍人脸功能模块。

首先导入cv库。

import cv2

然后调用我们的摄像头(0代表本地摄像头,其他数字代表外置摄像头)。

cap = cv2.VideoCapture(0)

使用 while 循环来确定它是否处于打开状态。

while(cap.isOpened()):

获取每一帧的图像。

ret_flag,Vshow = cap.read()

调用控制键盘函数来控制和确定按键。

k = cv2.waitKey(1) & 0xFF

使用 imshow 函数显示捕获的图像。

cv2.imshow('ceshi',Vshow)

监听键盘输入,按“s”键保存。

if k == ord('s'):

保存捕获图像的格式并打印提示文本。

cv2.imwrite('/tmp/'+str(num)+'.name'+'.jpg',Vshow) print('save '+str(num)+".jpg") print("-------------------------") num += 1

释放摄像头和内存。

cap.release() cv2.destroyAllWindows()

完整的代码片段

import cv2 cap = cv2.VideoCapture(0) falg = 1 num = 1 while(cap.isOpened()): ret_flag,Vshow = cap.read() k = cv2.waitKey(1) & 0xFF cv2.imshow('ceshi',Vshow) if k == ord('s'): cv2.imwrite('/tmp/'+str(num)+'.name'+'.jpg',Vshow) print('save '+str(num)+".jpg") print("-------------------------") num += 1 elif k == ord(' '): break cap.release() cv2.destroyAllWindows()

录人脸功能模块

在编写这个功能模块之前,我们需要在Pycharm或者cmd中在这个文件的根目录下使用如下命令安装人脸模块

pip install opencv-contrib-python

导入依赖

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

存储人脸数据

facesSamples=[]

存储名称数据

ids=[]

存储图片的信息

imagePaths=[os.path.join(path,f) for f in os.listdir(path)]

加载分类器

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

遍历图像

for imagePath in imagePaths:

将打开的图像转换为灰度

PIL_img = Image.open(imagePath).convert('L')

将图像转换为数组

img_numpy = np.array(PIL_img,'uint8')

获取图片中的人脸特征

faces = face_detector.detectMultiScale(img_numpy)

获取每张抓拍图片的id和name

id = int(os.path.split(imagePath)[1].split('.')[0])

防止无脸拍照

 for x,y,w,h in faces: ids.append(id) facesSamples.append(img_numpy[y:y+h,x:x+w])

打印面部特征和ID,并返回数据

 print('id',id) print('fs:',facesSamples) return facesSamples,ids

调用图片路径(步骤1抓脸后按s键保存到’/tmp/’路径下的图片)

path = '/tmp/'

检索图像数组和 ID 标签数组和名称

faces,ids=getImageAndLabels(path)

加载识别器

recognizer = cv2.face.LBPHFaceRecognizer_create()

训练数据

recognizer.train(faces,np.array(ids))

创建一个目录存放读取到的人脸信息

recognizer.write('tmp/tupian.yml')

完整的代码片段

import os import cv2 from PIL import Image import numpy as np def getImageAndLabels(path): facesSamples=[] ids=[] imagePaths=[os.path.join(path,f) for f in os.listdir(path)] face_detector = cv2.CascadeClassifier('<open-cv-installed-path>/sources/data/haarcascades/haarcascade_frontalface_default.xml') for imagePath in imagePaths: PIL_img = Image.open(imagePath).convert('L') img_numpy = np.array(PIL_img,'uint8') faces = face_detector.detectMultiScale(img_numpy) id = int(os.path.split(imagePath)[1].split('.')[0]) for x,y,w,h in faces: ids.append(id) facesSamples.append(img_numpy[y:y+h,x:x+w]) print('id',id) print('fs:',facesSamples) return facesSamples,ids if __name__ == '__main__': path = '/tmp/' faces,ids=getImageAndLabels(path) recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.train(faces,np.array(ids)) recognizer.write('tmp/tupian.yml')

人脸识别功能模块

导入依赖

import cv2 import os

加载训练好的数据文件

recogizer = cv2.face.LBPHFaceRecognizer_create()

加载保存的面部信息

recogizer.read('tmp/tupian.yml')

定义名称数组

names=[]

定义用于识别的全局变量

warningtime = 0

视频模块中的人脸识别

def face_detect_demo(img): gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) face_detector=cv2.CascadeClassifier('<open-cv-installed-path>/sources/data/haarcascades/haarcascade_frontalface_default.xml') face=face_detector.detectMultiScale(gray) 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 warningtime warningtime += 1 if warningtime > 100: # warning() warningtime = 0 cv2.putText(img, 'unknown', (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)

导入存储的图像名称标签

def name(): path = '/tmp/' # names = [] imagePaths=[os.path.join(path,f) for f in os.listdir(path)] for imagePath in imagePaths: name = str(os.path.split(imagePath)[1].split('.',2)[1]) names.append(name)

加载视频

cap=cv2.VideoCapture('1.mp4') 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()

完整的代码片段

import cv2 import os recogizer = cv2.face.LBPHFaceRecognizer_create() recogizer.read('tupian/tupian.yml') names=[] warningtime = 0 def face_detect_demo(img): gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) face_detector=cv2.CascadeClassifier('<open-cv-installed-path>/sources/data/haarcascades/haarcascade_frontalface_default.xml') face=face_detector.detectMultiScale(gray) 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 warningtime warningtime += 1 if warningtime > 100: # warning() warningtime = 0 cv2.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) def name(): path = '/tmp/' # names = [] imagePaths=[os.path.join(path,f) for f in os.listdir(path)] for imagePath in imagePaths: name = str(os.path.split(imagePath)[1].split('.',2)[1]) names.append(name) cap=cv2.VideoCapture('1.mp4') 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()

最后,希望这些示例代码对您的项目有所帮助!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/115802.html

(0)
上一篇 2025-12-01 21:26
下一篇 2025-12-01 21:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信