当前位置:科学 > 正文

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

2023-02-24 17:45:12  来源:MikoAndCody

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

下载 OpenCV 库

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


(资料图片仅供参考)

pip install opencv-python

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

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

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

抓拍人脸功能模块。

首先导入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 cv2cap = cv2.VideoCapture(0) falg = 1num = 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 osimport cv2from PIL import Imageimport 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 osimport cv2from PIL import Imageimport 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 cv2import 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 cv2import osrecogizer = cv2.face.LBPHFaceRecognizer_create()recogizer.read("tupian/tupian.yml")names=[]warningtime = 0def 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):        breakcv2.destroyAllWindows()cap.release()

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

关键词: OpenCV Python 人脸识别 操作系统 PyCharm

推荐阅读

北京雾霾的原因?北京雾霾的真正原因有哪些?

北京雾霾的真正原因有哪些?每年秋冬,黄淮和华北都会被雾霾困扰。雾霾散去,我们要等新一轮冷空气南下。北京的雾霾让人看不顺眼。空气控制 【详细】

太阳能电池背上市公司 太阳能电池背上市公司有哪些?

现如今太阳能电池已经发展的越来越好了,甚至有的家庭还用上了家用的光伏发电站了。但是呢我发现大家对于太阳能电池的了解还是不是很清楚, 【详细】

世界能源危机缓解的方法 世界能源危机缓解的方法有哪些?

世界能源危机是如何产生的?世界范围内,以石油为主的能源供需严重失衡,价格飞涨,影响和冲击着全球经济发展,给世界经济发展带来巨大风险 【详细】

用友软件怎么样 用友软件股份有限公司公司简介

用友网络科技股份有限公司(股票代码:600588)诞生于1988年,始终坚持用户之友的核心价值观,领航企业服务30年,是领先的综合型、融合化、生 【详细】

微博简介 微博是干什么用的?

相信很多人对微博应该很熟悉吧,接下来小编就带大家介绍一下微博是干什么用的?微博相关介绍的相关知识,大家可以了解一下。微博是基于用户 【详细】

关于我们  |  联系方式  |  免责条款  |  招聘信息  |  广告服务  |  帮助中心

联系我们:85 572 98@qq.com备案号:粤ICP备18023326号-40

科技资讯网 版权所有