Python OpenCV实现人脸、眼睛、嘴巴及鼻子检测完整教程
本文介绍如何使用Python和OpenCV库进行人脸检测。通过加载Haar级联XML分类器,结合摄像头实时视频流,实现对人脸、眼睛、嘴巴和鼻子的多目标检测与矩形框标记。文章提供了从环境配置、分类器路径查找至完整运行代码的详细步骤,适用于计算机视觉入门及本地部署场景。
OpenCV
OpenCV作为计算机视觉领域广泛使用的开源库,最初由C/C++开发,目前也支持Python语言调用。
OpenCV利用机器学习算法在图像中搜索人脸。由于人脸结构复杂,不存在单一的简单测试能直接判定人脸存在,但算法可以通过匹配数千种微小模式和特征来识别。系统将识别人脸的任务分解为数千个微小的子任务,每个子任务相对容易解决,这些子任务被称为分类器。
代码运行结果展示如下:

具体实现方法如下:
首先需要定位导入的XML分类器文件。
import cv2
print(cv2.__file__)找到cv2库的安装路径,进入其中的/data文件夹。

该目录下默认包含部分XML文件,但并非全部。若所需XML文件不在其中,需自行从网络下载并放置于该目录下以便调用。例如,需手动安装并调用'haarcascade_mcs_nose.xml'和'haarcascade_mcs_mouth.xml'文件。
代码导入部分如下:
import cv2导入XML文件时,可根据具体任务需求选择加载相应的分类器文件。
#人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
#眼睛检测器
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
#嘴巴检测器
mouth_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_mouth.xml')
#鼻子检测器
nose_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_nose.xml')设置显示窗口参数:
cv2.namedWindow('mytest', 0);
cv2.resizeWindow('mytest', 1500, 1000)打开摄像头并进行人脸识别处理:
#获取摄像头
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#打开摄像头
cap.open(0)
while cap.isOpened():
#获取画面
flag, frame = cap.read()
#人脸检测
faces = face_cascade.detectMultiScale(frame, 1.3, 2)
img = frame
for (x, y, w, h) in faces:
#根据人脸坐标和长度,宽度画出矩形
img = cv2.rectangle(img, (x, y), (x+w, y+h),(255, 0 ,0), 2)
#确定人脸范围,在人脸上搜索其他特征
face_area = img[y:y+h, x:x+w]
#人眼检测
eyes = eye_cascade.detectMultiScale(face_area, 1.3, 2)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(face_area, (ex, ey), (ex + ew, ey + eh), (255, 0 ,0), 1)
#嘴巴检测
mouth = mouth_cascade.detectMultiScale(face_area, 1.5, 2)
for (mx, my, mw, mh) in mouth:
cv2.rectangle(face_area, (mx, my), (mx + mw, my + mh), (0, 0, 255), 2)
# 鼻子检测
nose = nose_cascade.detectMultiScale(face_area, 1.2, 5)
for (nx, ny, nw, nh) in nose:
cv2.rectangle(face_area, (nx, ny), (nx + nw, ny + nh), (255, 0, 255), 2)
#画面显示
cv2.imshow('mytest', img)
#设置退出按钮
key_pressed = cv2.waitKey(100)
print('单机窗口,输入按键,电脑按键为',key_pressed,'按esc键结束')
if key_pressed == 27:
break
#关闭摄像头
cap.release()
#关闭图像窗口
cv2.destroyAllWindows()完整代码实现如下:
import cv2
#人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
#眼睛检测器
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
#嘴巴检测器
mouth_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_mouth.xml')
#鼻子检测器
nose_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_nose.xml')
#获取摄像头
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#打开摄像头
cap.open(0)
cv2.namedWindow('mytest', 0);
cv2.resizeWindow('mytest', 1500, 1000)
while cap.isOpened():
#获取画面
flag, frame = cap.read()
#人脸检测
faces = face_cascade.detectMultiScale(frame, 1.3, 2)
img = frame
for (x, y, w, h) in faces:
#根据人脸坐标和长度,宽度画出矩形
img = cv2.rectangle(img, (x, y), (x+w, y+h),(255, 0 ,0), 2)
#确定人脸范围,在人脸上搜索其他特征
face_area = img[y:y+h, x:x+w]
#人眼检测
eyes = eye_cascade.detectMultiScale(face_area, 1.3, 2)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(face_area, (ex, ey), (ex + ew, ey + eh), (255, 0 ,0), 1)
#嘴巴检测
mouth = mouth_cascade.detectMultiScale(face_area, 1.5, 2)
for (mx, my, mw, mh) in mouth:
cv2.rectangle(face_area, (mx, my), (mx + mw, my + mh), (0, 0, 255), 2)
# 鼻子检测
nose = nose_cascade.detectMultiScale(face_area, 1.2, 5)
for (nx, ny, nw, nh) in nose:
cv2.rectangle(face_area, (nx, ny), (nx + nw, ny + nh), (255, 0, 255), 2)
#画面显示
cv2.imshow('mytest', img)
#设置退出按钮
key_pressed = cv2.waitKey(100)
print('单机窗口,输入按键,电脑按键为',key_pressed,'按esc键结束')
if key_pressed == 27:
break
#关闭摄像头
cap.release()
#关闭图像窗口
cv2.destroyAllWindows()总结
至此,关于Python实现人脸检测的教程介绍完毕。如需了解更多Python人脸检测相关内容,可搜索本站过往文章或继续阅读后续相关文章,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









