这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 【RaspberryPi5开发板方案创意赛】智能车牌识别系统--OpenCV自带

共1条 1/1 1 跳转至

【RaspberryPi5开发板方案创意赛】智能车牌识别系统--OpenCV自带模型应用

菜鸟
2025-12-16 18:55:28     打赏

在正式开发车牌识别功能前,我们先利用OpenCV自带的预训练模型实现实时人脸和猫脸检测,验证摄像头和环境配置的正确性。

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()


返回树莓派的本地终端(非SSH会话),执行命令运行程序:

python usbcam_catface.py

程序启动后自动全屏显示摄像头画面,实时检测并标注不同目标,每个检测到的目标都会用相应颜色的方框标注,并在框上方显示目标类型名称,便于直观识别。

  • 绿色框:正面人脸

  • 黄色框:侧面人脸

  • 蓝色框:猫脸

  • 红色框:全身人体

视频放B站:https://www.bilibili.com/video/BV1oKqhBMEkg/





关键词: RaspberryPi5    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]