前言
在计算机视觉入门项目中,人脸检测是最经典、最易上手的实战案例。OpenCV 自带了基于 Haar 特征的级联分类器,能够快速实现人脸、眼睛、微笑等目标检测,无需训练模型,开箱即用。
本文将带你一步步实现:
-
读取本地视频文件
-
使用 Haar 级联检测器实时识别人脸
-
在画面中绘制人脸矩形框
-
解决常见报错:
!_src.empty()、视频读取异常等
一、环境准备
-
Python 3.x
-
OpenCV-Python
pip install opencv-python
同时需要下载官方提供的 Haar 特征文件:
haarcascade_frontalface_default.xml
(OpenCV 安装目录自带,也可从官方仓库下载)
二、实现思路
-
加载 Haar 人脸检测分类器
-
打开本地视频文件
-
循环读取每一帧图像
-
转为灰度图(提升检测速度)
-
调用
detectMultiScale检测人脸 -
在原图上绘制矩形框
-
显示结果,按 ESC 退出
三、完整代码
import cv2 # 加载 Haar 人脸检测器 faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 打开本地视频文件 cap = cv2.VideoCapture('smile.mp4') while True: # 读取一帧画面 ret, frame = cap.read() # 如果读取失败(视频结束),退出循环 if not ret: break # 镜像翻转(可选) frame = cv2.flip(frame, 1) # 转为灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 人脸检测 faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, # 缩放比例 minNeighbors=16, # 相邻矩形个数,过滤误判 minSize=(20, 20) # 最小人脸尺寸 ) # 遍历检测到的人脸,画框 for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示结果 cv2.imshow('Face Detection', frame) # 按 ESC 键退出 key = cv2.waitKey(10) if key == 27: break # 释放资源 cap.release() cv2.destroyAllWindows()
四、关键函数解释
1. cv2.CascadeClassifier
加载 Haar 级联分类器模型,用于检测目标区域。
2. cap.read()
读取视频一帧,返回两个值:
-
ret:是否读取成功(True/False) -
frame:当前帧图像
3. detectMultiScale
核心检测函数,参数说明:
-
gray:灰度图像 -
scaleFactor:每次图像缩小的比例 -
minNeighbors:目标至少被检测到多少次才判定为人脸(过滤误检) -
minSize:忽略小于此尺寸的目标
4. cv2.rectangle
在图像上绘制矩形框:
-
(x,y):左上角坐标
-
(x+w,y+h):右下角坐标
-
(0,255,0):绿色框
-
2:线条粗细
五、常见报错与解决
1. error: (-215:Assertion failed) !_src.empty()
原因 :读取到空图像,视频路径错误 / 视频已读完 / cap.release() 写在循环内。
解决:
-
检查视频文件名与路径
-
确保
cap.release()在循环外 -
使用
if not ret: break判断视频结束
2. 检测不到人脸
解决:
-
降低
minNeighbors(如 5~9) -
调小
minSize -
确保光线充足、人脸正对镜头
3. 视频卡顿
解决:
-
增大
waitKey间隔 -
缩小图像尺寸后再检测
六、效果展示
运行程序后,会弹出视频窗口,所有人脸会被绿色矩形框自动标注,实时流畅检测。
可轻松扩展到:
-
摄像头实时人脸检测
-
眼睛检测
-
微笑检测
-
人脸计数
七、总结
本文使用 OpenCV + Haar 特征实现了视频人脸检测,代码轻量、运行速度快,非常适合计算机视觉入门练习。
通过修改级联分类器文件,还能快速实现眼睛、微笑、车牌等检测任务。
需要我再帮你加一段运行效果截图说明 、或者改成摄像头实时检测版本的博客内容吗?