天天快播:使用 Python 和 OpenCV 进行面部识别 - 应用于监控、人脸门禁和考勤等
在本文中,我们探索 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年,是领先的综合型、融合化、生 【详细】
微博简介 微博是干什么用的?
相信很多人对微博应该很熟悉吧,接下来小编就带大家介绍一下微博是干什么用的?微博相关介绍的相关知识,大家可以了解一下。微博是基于用户 【详细】
相关新闻
- 天天快播:使用 Python 和 OpenCV 进行面部识别 - 应用于监控、人脸门禁和考勤等
- VLOOKUP这样的用法你见过吗?_全球微速讯
- 每日简讯:2023年了,是他们在买599元的手机
- 全球实时:宜昌市首家政府主导的托育园在伍家岗区诞生
- 疫情守护:海尔家用全自动智能除菌洗碗机_天天信息
- 全球热头条丨小米在印度推出第一款智能手机自动售货机
- 观热点:微星上架34吋量子点技术曲面带鱼屏显示器 定价3999元
- 环球讯息:大朋 VR眼镜:在家也能看3d电影
- 要闻:林内反渗透净水机,让你畅饮即滤鲜活水
- 【当前独家】细思极恐ChatGPT引领未来军事化AI,无人机从军到民大升级
- 科技驱动力|中国造ChatGPT来了!它聪明吗,我们替你试了试
- 动态焦点:iPhone14降价之后,iPhone13的降价情况如何?还值得买吗?
- iOS 16 降级 iOS 15 方法来了!
- 狗狗币和柴犬 竞争对手 今年迄今飙升近500% 天天微动态
- 启客多重磅发布「企业资质营销解决方案」 重塑产业发展新动能
- 今日热讯:AIGC杀入社交,微信一统江湖的时代要变天了?
- 世界时讯:从小米11 Ultra换成iPhone 14 Pro,一周之后彻底放弃了
- iPhone 15系列新配色曝光:红、粉、蓝都有,这颜值你给几分?
- 原来iPhone自带的闹钟这么好用,用了5年iPhone才知道
- 世界热门:安卓微信 8.0.33 正式版发布,带来 8 大新变化