好的,我将为你生成一个完整、可直接运行的Python脚本,用于通过摄像头实时检测人脸和眼睛。代码中包含了详细的注释,并考虑了摄像头无法打开、模型加载失败等常见问题。
```python
"""
实时人脸与眼睛检测系统
依赖库: opencv-python
安装命令: pip install opencv-python
"""
import cv2
import sys
def main():
==================== 1. 加载预训练模型 ====================
OpenCV 自带的人脸检测级联分类器
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
眼睛检测级联分类器(注意:此模型对侧脸或遮挡的眼睛检测效果有限)
eye_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_eye.xml'
)
检查模型是否成功加载
if face_cascade.empty():
print("[错误] 人脸检测模型加载失败!请检查OpenCV安装是否完整。")
sys.exit(1)
if eye_cascade.empty():
print("[警告] 眼睛检测模型加载失败,将只进行人脸检测。")
==================== 2. 初始化摄像头 ====================
0 代表默认摄像头(笔记本内置摄像头),如果有多个摄像头可尝试 1, 2...
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("[错误] 无法打开摄像头,请检查设备连接或权限设置。")
sys.exit(1)
设置摄像头分辨率(可选,部分摄像头不支持)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
print("按 'q' 键退出程序")
==================== 3. 主循环:逐帧处理 ====================
while True:
读取一帧图像
ret, frame = cap.read()
if not ret:
print("[警告] 无法读取视频帧,可能摄像头被占用或断开。")
break
转换为灰度图(检测算法需要灰度图像,提高速度)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
直方图均衡化增强对比度(有助于检测)
gray_eq = cv2.equalizeHist(gray)
---------- 人脸检测 ----------
参数说明:
scaleFactor: 每次图像尺寸减小比例,1.1 表示每次缩小10%,值越小检测越慢但更准确
minNeighbors: 每个候选区域需要满足的邻近矩形数量,值越大误检越少但可能漏检
minSize: 较小检测尺寸(小于此尺寸的人脸忽略)
faces = face_cascade.detectMultiScale(
gray_eq,
scaleFactor=1.1,
minNeighbors=5,
minSize=(60, 60),
flags=cv2.CASCADE_SCALE_IMAGE
)

---------- 对每张检测到的人脸进行处理 ----------
for (x, y, w, h) in faces:
绘制人脸矩形框(绿色)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
在人脸区域内检测眼睛(缩小搜索范围提高准确性和速度)
roi_gray = gray_eq[y:y + h, x:x + w]
roi_color = frame[y:y + h, x:x + w]
眼睛检测(仅在人脸区域)
eyes = eye_cascade.detectMultiScale(
roi_gray,
scaleFactor=1.05,
minNeighbors=3,
minSize=(20, 20)
)
绘制眼睛矩形框(蓝色)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (255, 0, 0), 2)
---------- 显示结果 ----------
cv2.imshow('Face & Eye Detection - Press "q" to quit', frame)
按键检测:按 'q' 或 ESC 退出
key = cv2.waitKey(1) & 0xFF
if key == ord('q') or key == 27: 27 是 ESC 键的ASCII码
break
==================== 4. 清理资源 ====================
cap.release()
cv2.destroyAllWindows()
print("程序已退出,摄像头已释放。")
if __name__ == "__main__":
main()
```
---
运行说明
1. 安装依赖(如果尚未安装):
```bash
pip install opencv-python
```
2. 运行脚本:
```bash
python face_eye_detection.py
```
3. 操作:
- 程序启动后,摄像头画面会显示在窗口中。
- 绿色框表示检测到的人脸,蓝色框表示检测到的眼睛。
- 按键盘 `q` 键或 `ESC` 键退出程序。
---
常见问题与优化建议
| 问题 | 可能原因与解决方法 |
|------|-------------------|
| 摄像头无法打开 | 检查是否被其他程序占用;尝试将 `VideoCapture(0)` 改为 `VideoCapture(1)` 或更高数字;确保系统已授予摄像头权限。 |
| 检测速度慢 | 减小输入分辨率(如改为 `320x240`);调大 `scaleFactor`(如 `1.2`);调大 `minNeighbors`(如 `6`)。 |
| 眼睛检测不准 | 该级联模型对正脸效果较好,侧脸或低头时容易漏检;可尝试使用更准确的模型(如DNN)替换。 |
| 误检率高 | 调大 `minNeighbors` 值;调大 `minSize` 较小尺寸;确保光照均匀。 |
---
扩展方向(可选)
如果你希望进一步提升检测效果,可以考虑:
- 使用 OpenCV DNN 模块加载深度学习模型(如 `res10_300x300_ssd_iter_140000.caffemodel`)进行更鲁棒的人脸检测。
- 增加 眨眼检测(通过眼睛纵横比 EAR 算法)。
- 将检测结果实时输出为日志或触发其他操作。
如果需要上述扩展功能的代码,请告诉我,我可以为你生成对应的实现。