一.基础
人脸检测是计算机视觉领域的基础任务,核心目标是从图像或视频帧中自动定位并识别出人脸区域(通常用矩形边界框标记),不涉及身份识别,仅关注 "是否存在人脸" 及 "人脸在哪里"。其原理可分为传统方法 和现代深度学习方法两大体系,核心逻辑是 "特征提取 + 分类判断",但具体实现差异较大。
通用流程:从图像到人脸框的核心步骤
无论传统方法还是深度学习方法,人脸检测的基本流程可概括为以下四步:
- 图像预处理:统一输入格式(如灰度化、尺寸归一化),减少干扰信息(如降噪);
- 候选区域生成:通过滑动窗口、特征响应等方式,筛选出可能含有人脸的区域;
- 特征提取:从候选区域中提取能表征 "人脸" 的关键特征(如五官分布、边缘纹理等);
- 分类判断:通过分类器判断候选区域是否为人脸,最终输出所有为人脸的边界框。
二.实现
OpenCV中自带已训练好的检测器,包括面部、眼睛、猫脸等,都保存在xml文件中,通过以下方式找到他们
python
import cv2 as cv
print(cv.__file__)

利用这些文件来识别人脸,眼睛等。检测流程如下:
1.读取图片,并转化成灰度图
2.实例化人脸和眼睛检测的分类器对象
#1实例化级联分类器
classifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
#加载分类器
classifier.load("haarcascade_frontalface_default.xml")
3.进行人脸和眼睛的识别检测
rect = classifier.detectMultScale(gray,scaleFactor,minNeighbors,minSize,maxsize)
**gray:**要进行检测的人脸图片
**scaleFactor:**前后俩次扫描中,搜索窗口的比例系数
**minNeighbors:**目标被检测的次数才会被认为是检测的目标
**minSize,maxsize:**目标的最小尺寸和最大尺寸
4.将目标检测结果绘制出来
5.主程序
python
import cv2 as cv
import matplotlib.pyplot as plt
# 1.以灰度图的形式读取图片
img = cv.imread("C:\\Users\\JWTV\\Desktop\\111.png")
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2.实例化OpenCV人脸和眼睛识别的分类器
face_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")
face_cas.load('E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
eyes_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")
eyes_cas.load("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")
# 3.调用识别人脸
faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
for faceRect in faceRects:
x, y, w, h = faceRect
# 框出人脸
cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
# 4.在识别出的人脸中进行眼睛的检测
roi_color = img[y:y + h, x:x + w]
roi_gray = gray[y:y + h, x:x + w]
eyes = eyes_cas.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
# 检测结果的绘制
plt.figure(figsize=(8, 6), dpi=100)
plt.imshow(img[:, :, ::-1]), plt.title('result')
plt.xticks([]), plt.yticks([])
plt.show()

6.在视频中也可以进行类似的操作
python
import cv2 as cv
import matplotlib.pyplot as plt
# 1.读取视频
cap = cv.VideoCapture("C:\\Users\\JWTV\\Desktop\\111.png")
# 2.在每一帧数据中进行人脸识别
while(cap.isOpened()):
ret,frame = cap.read( )
if ret==True:
gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
# 3.实例化OpenCV人脸识别的分类器
face_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")
face_cas.load('E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
#4.调用识别人脸
faceRects =face_cas.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32, 32))
for faceRect in faceRects:
x,y,w,h = faceRect
# 框出人脸
cv.rectangle(frame,(x,y),(x + h,y + w) , (0,255,0),3)
cv.imshow("frame",frame)
if cv.waitKey(1) & 0xFF == ord('q') :
break
#5.释放资源
cap.release()
cv.destroyAllWindows()