代码
视频和模型库在第一篇文章中有git地址。
import cv2 as cv
# 模型路径
MODEL_BIN = "models/face_detector/opencv_face_detector_uint8.pb"
CONFIG_TEXT = "models/face_detector/opencv_face_detector.pbtxt"
def load_model(model_bin, config_text):
"""加载 DNN 模型"""
try:
net = cv.dnn.readNetFromTensorflow(model_bin, config_text)
return net
except Exception as e:
print(f"加载模型失败: {e}")
return None
def process_frame(net, frame):
"""对帧进行人脸检测"""
h, w, _ = frame.shape
# 预处理输入图像
blob = cv.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)
net.setInput(blob)
# 执行前向传播
outs = net.forward() # 输出形状: 1x1xNx7
for detection in outs[0, 0, :, :]:
score = float(detection[2])
if score > 0.5: # 置信度阈值
# 计算边界框
left = int(detection[3] * w)
top = int(detection[4] * h)
right = int(detection[5] * w)
bottom = int(detection[6] * h)
# 绘制矩形框
cv.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
# 绘制置信度
label = f'{score:.2f}'
label_size, baseline = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.5, 1)
top = max(top, label_size[1]) # 确保文本不超出顶部
cv.rectangle(frame, (left, top - label_size[1] - baseline),
(left + label_size[0], top + baseline), (0, 255, 0), cv.FILLED)
cv.putText(frame, label, (left, top - baseline), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)
return frame
def face_detect(video_path=None):
"""人脸检测主函数"""
# 加载模型
net = load_model(MODEL_BIN, CONFIG_TEXT)
if net is None:
return
# 打开视频源
video_capture = cv.VideoCapture(0 if video_path is None else video_path)
if not video_capture.isOpened():
print("无法打开视频源")
return
print("按 'q' 键退出")
while True:
ret, frame = video_capture.read()
if not ret:
print("视频结束或无法读取帧")
break
# 处理帧
frame = process_frame(net, frame)
# 显示结果
cv.imshow('Video', frame)
# 按 'q' 键退出
if cv.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
video_capture.release()
cv.destroyAllWindows()
# 调用函数
# face_detect('images/example_dsh.mp4')
face_detect(0)
功能概述
- 加载预训练的 TensorFlow 模型进行人脸检测。
- 支持从摄像头或视频文件实时读取视频流。
- 检测到的人脸用矩形框标注,并在框旁显示置信度。
- 实现模块化代码设计,方便扩展和优化。
应用场景
- 实时监控:在安全监控中检测人脸。
- 人脸识别前处理:实时获取人脸图像,用于后续识别。
- 表情分析:结合其他模型,进行实时表情检测。
运行效果
结尾
跟随贾老师的课程到这里就结束了,后续本系列可能还会增加老师关于Python-OpenCV相关的文章,敬请期待!
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END
暂无评论内容