使用mediapipe和OpenCV实现摄像头实时人脸检测
# 摄像头实时人脸检测
# opencv
import time
import cv2
# mediapipe ai工具包
import mediapipe as mp
# 进度条库
from tqdm import tqdm
# 导入模型
mp_face_detection = mp.solutions.face_detection
model = mp_face_detection.FaceDetection(
min_detection_confidence=0.5, # 置信度阈值,过滤掉小于置信度的预测框
model_selection=1, # 选择模型,0 适用于人脸离摄像头比较近(2米内),1 适用于比较远(5米以内)
)
# 导入可视化函数以及可视化样式
mp_drawing = mp.solutions.drawing_utils
# 关键点样式
keypoint_style = mp_drawing.DrawingSpec(thickness=5, circle_radius=3, color=(0, 255, 0))
# 人脸预测框样式
bbox_style = mp_drawing.DrawingSpec(thickness=5, circle_radius=3, color=(255, 0, 0))
# 处理单帧的函数
def process_frame(img):
# 记录该帧开始处理的时间
start_time = time.time()
# BGR转RGB
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 将RGB输入模型预测结果
results = model.process(img_RGB)
if results.detections: # 只有检测出人脸的时候才可视化
# 可视化人脸框和人脸关键点
for detection in results.detections:
mp_drawing.draw_detection(img,
detection,
keypoint_drawing_spec=keypoint_style,
bbox_drawing_spec=bbox_style)
# 记录该帧完毕处理的时间
end_time = time.time()
# 计算每秒处理图像帧数FPS
FPS = 1 / (end_time - start_time)
scaler = 1
# 在图像上写FPS数值,参数依次为图片、添加的文字、左上角坐标、字体、字体大小、颜色、字体粗细
img = cv2.putText(img, 'FPS ' + str(int(FPS)), (25 * scaler, 50 * scaler), cv2.FONT_HERSHEY_SIMPLEX, 1.25 * scaler,
(0, 0, 255), 1)
return img
# 调用摄像头获取每帧
# 获取摄像头
cap = cv2.VideoCapture(0)
# 打开cap
cap.open(0)
# 无限循环,直到break被触发
while cap.isOpened():
# 获取画面
success, frame = cap.read()
if not success:
print('出错啦!')
break
# 处理帧函数
frame = process_frame(frame)
# 展示处理后的三通道图像
cv2.imshow('my_window', frame)
# 按q或Esc退出
if cv2.waitKey(1) in [ord('q'), 27]:
break
# 关闭摄像头
cap.release
# 关闭窗口图像
cv2.destoryAllWindows()
作者:木子欢儿
出处:https://www.cnblogs.com/HGNET/p/16506246.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
部分文章来源于网络,如疏漏未标注原文地址或侵权,请联系进行删除。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】AI 的力量,开发者的翅膀:欢迎使用 AI 原生开发工具 TRAE
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
· 我的AI自学路线,可能对你有用
· WPF 引用 ASP.NET Core 的 AOT 版本
· 纯 C#实现+AOT 打造的智能PDF目录提取工具 PdfTocExtractor
· C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述-下篇)
· 深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南
2020-07-22 【Java】计算1!+2!+.....+20!的值
2020-07-22 【Java】设计一个简单的计算器,实现加减乘除运算并输出结果
2020-07-22 【Java】输出10-1000中间既能被3整除又能被7整除的数
2020-07-22 【Java】输出50-100范围内所有的素数
2020-07-22 【Java】利用for循环打印心型
2020-07-22 【Java】二重循环示例:打印* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2020-07-22 【Java】求100以内的斐波那契数列