网站首页 > 技术文章 正文
在本文中,我们探索 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 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()
最后,希望这些示例代码对您的项目有所帮助!
猜你喜欢
- 2024-12-19 提高效率的 10 个 Python 调试技巧
- 2024-12-19 python-IO多路复用(select、poll、epoll)
- 2024-12-19 一篇文章搞懂 Python select 模块
- 2024-12-19 每个python人都离不开的12个python库
- 2024-12-19 使用 Python3 uWSGI 实现并发和监控的 Web 应用部署(44)
- 2024-12-19 Python 自动化: eip、cen监控数据对接到 grafana
- 2024-12-19 python 你需要知道的
- 2024-12-19 监控老板一举一动 99行python助你无风险摸鱼
- 2024-12-19 大神教你如何用python监听软件
- 2024-12-19 系统监控利器:轻松掌握Python的psutil包
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 90℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)