各位同学好 。今天和大家分享一下如何使用MediaPipe完成人脸实时跟踪检测 。先放张图看效果 。Fps值为14 。右侧的输出为:每帧图像是人脸的概率 。检测框的左上角坐标及框的宽高 。
有需要的可以使用 cv2.VideoCapture(0) 捕获电脑摄像头 。本节就用视频进行人脸识别 。
文章插图
文章插图
1. 导入工具包#安装opencvpipinstallopencv-contrib-python#安装mediapipepipinstallmediapipe#pipinstallmediapipe--user#有user报错的话试试这个#安装之后导入各个包importcv2#opencvimportmediapipeasmpimporttime
人脸检测的相关说明见官方文档:Face Detection – mediapipe
MediaPipe 人脸检测是一种识别速度超快的方法 。具有 6 个特征点和多面支持 。它基于BlazeFcae一个轻量级且性能良好的面部检测器 。专为移动GPU推理量身定制 。该探测器的超实时性能使其能够应用于任何需要精确感兴趣面部区域作为其他任务特定模型输入的实时取景器体验 。例如3D面部关键点或几何估计(例如 MediaPipe Face Mesh)面部特征或表情分类以及面部区域分割 。
2. 相关函数说明从mediapipe中导入检测方法 。今天我们使用人脸检测mediapipe.solutions.face_detection 。
mediapipe.solutions.hands#手部关键点检测mediapipe.solutions.pose#人体姿态检测mediapipe.solutions.face_mesh#人脸网状检测mediapipe.solutions.face_detection#人脸识别....................
(1)mediapipe.solutions.face_detection.FaceDetection() 人脸检测函数
参数:
min_detection_confidence: 默认为 0.5 。人脸检测模型的最小置信值 (0-1之间) 。高于该置信度则将检测视为成功 。
返回值:
detections:检测到的人脸的集合 。其中每个人脸都表示为一个检测原始消息 。其中包含 人脸的概率、1 个边界框、6 个关键点(右眼、左眼、鼻尖、嘴巴中心、右耳、左耳) 。边界框由 xmin 和 width (由图像宽度归一化为 [0, 1])以及 ymin 和 height (由图像高度归一化为 [0, 1])组成 。每个关键点由 x 和 y 组成 。分别通过图像宽度和高度归一化为 [0, 1] 。
返回值.score: 获取图像是人脸的概率
返回值.location_data: 获取识别框的 x, y, w, h 和 6个关键点的 x, y
返回值.location_data.relative_bounding_box: 获取识别框的 x, y, w, h
返回值.location_data.relative_keypoints: 6个关键点的 x, y 组成的列表
(2)mediapipe.solutions.drawing_utils.draw_landmarks() 绘制手部关键点的连线
参数:
image: 需要画图的原始图片
landmark_list: 检测到的手部关键点坐标
connections: 连接线 。需要把那些坐标连接起来
landmark_drawing_spec: 坐标的颜色 。粗细
connection_drawing_spec: 连接线的粗细 。颜色等
3. 只绘制识别框和关键点使用 cv2.VideoCapture() 读取视频文件时 。文件路径最好不要出现中文 。防止报错 。
变量.read() 每次执行就从视频中提取一帧图片 。需要循环来不断提取 。用success来接收是否能打开 。返回True表示可以打开 。img保存返回的的每一帧图像 。
由于读入视频图像通道一般为RGB 。而opencv中图像通道的格式为BGR 。因此需要 cv2.cvtColor() 函数将opencv读入的视频图像转为RGB格式 cv2.COLOR_BGR2RGB 。
importcv2importmediapipeasmpimporttime#导入人脸识别模块mpFace=mp.solutions.face_detection#导入绘图模块mpDraw=mp.solutions.drawing_utils#自定义人脸识别方法 。最小的人脸检测置信度0.5faceDetection=mpFace.FaceDetection(min_detection_confidence=0.5)#(1)导入视频filepath='C:\GameDownload\DeepLearning\face.mp4'cap=cv2.VideoCapture(filepath)pTime=0#记录每帧图像处理的起始时间#(2)处理每一帧图像whileTrue:#每次取出一帧图像 。返回是否读取成功(True/False) 。以及读取的图像数据success,img=cap.read()#将opencv导入的BGR图像转为RGB图像imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#将每一帧图像传给人脸识别模块results=faceDetection.process(imgRGB)#如果检测不到人脸那就返回Noneifresults.detections:#返回人脸关键点索引index 。和关键点的坐标信息forindex,detectioninenumerate(results.detections):#遍历每一帧图像并打印结果print(index,detection)#每帧图像返回一次是人脸的几率 。以及识别框的xywh 。后续返回关键点的xy坐标#print(detection.score)#是人脸的的可能性#print(detection.location_data.relative_bounding_box)#识别框的xywh#绘制关键点信息及边界框mpDraw.draw_detection(img,detection)#记录每帧图像处理所花的时间cTime=time.time()fps=1/(cTime-pTime)#计算fps值pTime=cTime#更新每张图像处理的初始时间#把fps值显示在图像上,img画板;fps变成字符串;显示的位置;设置字体;字体大小;字体颜色;线条粗细cv2.putText(img,f'FPS:{str(int(fps))}',(10,50),cv2.FONT_HERSHEY_PLAIN,3,(0,255,0),3)#显示图像 。输入窗口名及图像数据cv2.imshow('image',img)ifcv2.waitKey(50)&0xFF==27:#每帧滞留50毫秒后消失 。ESC键退出break#释放视频资源cap.release()cv2.destroyAllWindows()
推荐阅读
- 孩子从几岁开始识字比较合适?
- 到底是六七十年代的冬天冷,还是现在的冬天冷?
- 如何理解王阳明的“四句教”?“无善无恶是心之体,有善有恶是意之动,知善知恶是良知,为善去恶是格物”?
- 包包链条掉色怎么补救 包包链条褪色了怎么变新
- 六七十年代家里有20000块钱,算什么家庭?
- 小孩子现在学习的国学到底是什么?如果学校教授三从四德,你会同意吗?为什么?
- 五十、六十、七十年代出生的朋友,穿过手工做的布鞋吗?还记得是谁做的吗?
- 属虎的人性格怎么样?
- 好看的校园言情小说甜文 高质量甜宠文青春校园