1、模型介绍1、OpenCV Haar Cascade模型介绍
OpenCV自带了一系列基于Haar特征的级联分类器模型,这些模型位于/usr/share/opencv4/haarcascades/目录中,都是XML格式的文件。这些模型虽然不如深度学习模型准确,但计算量小,适合在树莓派等资源受限的设备上运行。
主要模型分类:
人脸检测模型:
haarcascade_frontalface_default.xml - 标准正面人脸检测
haarcascade_frontalface_alt.xml - 改进版正面人脸检测
haarcascade_profileface.xml - 侧面人脸检测
haarcascade_eye.xml - 眼睛检测
haarcascade_smile.xml - 微笑检测
动物检测模型:
haarcascade_frontalcatface.xml - 基础猫脸检测
haarcascade_frontalcatface_extended.xml - 增强版猫脸检测
人体检测模型:
haarcascade_fullbody.xml - 全身人体检测
haarcascade_upperbody.xml - 上半身检测
车牌检测模型:
haarcascade_license_plate_russian.xml - 俄罗斯车牌检测
haarcascade_russian_plate_number.xml - 俄罗斯车牌号码检测
注意:OpenCV自带的只有俄罗斯车牌检测模型,对于中国车牌识别效果不佳。在实际的车牌识别项目中,我们需要使用专门针对中国车牌训练的深度学习模型。
2、实时人脸与猫脸检测实现
为了验证系统摄像头和OpenCV环境正常工作,我们创建一个多目标检测程序,用于测试摄像头功能和模型效果。
打开Thonny IDE,将解释器设置为"远程Python 3 (SSH)",连接到树莓派5。新建文件usbcam_catface.py,输入以下代码:
#!/usr/bin/env python3
"""
基于Raspberry Pi OS Trixie
支持:人脸、侧脸、猫脸、全身
"""
import cv2
import os
# 分类器路径
CASCADE_DIR = "/usr/share/opencv4/haarcascades"
MODELS = {
"face": "haarcascade_frontalface_default.xml",
"profile": "haarcascade_profileface.xml",
"cat": "haarcascade_frontalcatface_extended.xml",
"fullbody": "haarcascade_fullbody.xml"
}
def load_cascades():
cascades = {}
for name, filename in MODELS.items():
path = os.path.join(CASCADE_DIR, filename)
if not os.path.exists(path):
print(f"缺失文件: {path}")
continue
cascade = cv2.CascadeClassifier(path)
if cascade.empty():
print(f"无法加载: {name}")
else:
cascades[name] = cascade
print(f"加载: {name}")
return cascades
def multi_detection():
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_FPS, 15)
if not cap.isOpened():
print("摄像头打开失败")
return
cascades = load_cascades()
if not cascades:
return
# >>>>>>>>>> 新增:创建全屏窗口 <<<<<<<<<<
window_name = 'Multi Detection'
cv2.namedWindow(window_name, cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty(window_name, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
# >>>>>>>>>> 全屏设置结束 <<<<<<<<<<
print("按 'q' 退出")
try:
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人脸(正面)
if "face" in cascades:
faces = cascades["face"].detectMultiScale(gray, 1.1, 4, minSize=(60, 60))
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(frame, 'Face', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
# 人脸(侧面)
if "profile" in cascades:
profiles = cascades["profile"].detectMultiScale(gray, 1.1, 4, minSize=(60, 60))
for (x, y, w, h) in profiles:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 255, 0), 2)
cv2.putText(frame, 'Profile', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 0), 2)
# 猫脸
if "cat" in cascades:
cats = cascades["cat"].detectMultiScale(gray, 1.1, 3, minSize=(80, 80))
for (x, y, w, h) in cats:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.putText(frame, 'Cat', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 2)
# 全身
if "fullbody" in cascades:
bodies = cascades["fullbody"].detectMultiScale(gray, 1.1, 3, minSize=(100, 200))
for (x, y, w, h) in bodies:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.putText(frame, 'Body', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
# 显示到全屏窗口
cv2.imshow(window_name, frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
multi_detection()python usbcam_catface.py
程序启动后自动全屏显示摄像头画面,实时检测并标注不同目标,每个检测到的目标都会用相应颜色的方框标注,并在框上方显示目标类型名称,便于直观识别。
绿色框:正面人脸
黄色框:侧面人脸
蓝色框:猫脸
红色框:全身人体


我要赚赏金
