eefocus_4062187 发表于 2025-9-21 21:17:36

【AIMB-2210研华AMD嵌入式主板】AI 视觉识别应用:车牌识别

本帖最后由 eefocus_4062187 于 2025-9-25 14:45 编辑

# 【AIMB-2210研华AMD嵌入式主板】AI 视觉识别应用:车牌识别

本文介绍了 AIMB-2210 研华 AMD 嵌入式主板实现 AI 视觉识别类相关应用:车牌识别,包括模型训练、板端推理、关键代码解析、流程图、动态识别等。

## 项目介绍

基于 YOLO 模型以及 OCR 库实现车牌识别与文字标识,包括

- 车牌识别的板端推理:包括流程图、代码、效果演示;
- 车牌识别的动态监测:包括流程图、代码、效果演示;

## 板端推理

实现本地车牌图片的识别和推理,并将识别结果以弹窗形式显示出来。

### 流程图

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211527f4h48uzh4e58ahuh.jpg)

### 代码

新建 `license_plate_recognition.py` 并添加如下代码

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import cv2
from ocr_rec import TextRecognizer, init_args
from PIL import Image, ImageDraw, ImageFont
from ultralytics import YOLO
import warnings
warnings.filterwarnings("ignore")

# ========== 图片路径 ==========
IMG_FILE = "license_img/yue.jpg"

# =========== 复用类 ===========
class PlateRecognizer:
    def __init__(self, det_model_path="model/y11n-pose_plate_best.onnx"):
      self.model_det = YOLO(det_model_path)
      parser = init_args().parse_args()
      self.model_ocr = TextRecognizer(parser)

    def recognize(self, img):
      plate_objs = []
      plates = self.model_det(img, verbose=False)
      for plate, conf in zip(plates.boxes.xyxy, plates.boxes.conf):
            x1, y1, x2, y2 = map(int, plate.cpu())
            plate_img = img
            try:
                rec_res, _ = self.model_ocr()
            except Exception as E:
                print(E)
                continue
            if len(rec_res) > 0:
                plate_objs.append({
                  'text': rec_res,
                  'score_text': rec_res,
                  'bbox': ,
                  'score_bbox': conf.cpu().numpy().item()
                })
      return plate_objs

def DrawPlateNum(img, plate_num, x1, y1):
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img_pil = Image.fromarray(img_rgb)
    draw = ImageDraw.Draw(img_pil)
    font = ImageFont.truetype("simsun.ttc", 40)
    draw.text((x1, y1 - 35), plate_num, font=font, fill=(255, 255, 0))
    return cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)

# ========== 主程序 ==========
def main():
    img = cv2.imread(IMG_FILE)
    if img is None:
      print(f"未找到图片:{IMG_FILE}")
      cv2.waitKey(0)
      return

    recognizer = PlateRecognizer()
    plates = recognizer.recognize(img)

    for p in plates:
      x1, y1, x2, y2 = p['bbox']
      cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2)
      img = DrawPlateNum(img, p['text'], x1, y1)
      print(f"车牌: {p['text']}置信度: {p['score_text']:.4f}框置信度: {p['score_bbox']:.4f}")

    cv2.imshow("车牌识别结果", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()
```

- 保存代码;
- 右键该文件,选择使用 IDEL 编辑;
- 菜单栏选择 `Run` - `Run Module` 选项,运行程序;

> 或双击 `*.py` 文件运行。

### 效果

- 运行程序后弹出识别结果图片,自动标注车牌范围选框、车牌号;
- 同时终端打印识别结果,包括车牌号和置信度等信息;

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211544e05t49xtjy1dclcq.jpg)

更多识别效果如下

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211559rnigzninieiigiig.jpg)

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211610za0mmjml50um5ams.jpg)

- 对于不同角度的识别,仍能保持较好的精度;

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211621jctpynicspydddke.jpg)

- 多个车牌同时识别的情况;

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211632gax6sn9ps6sngoyn.jpg)

## 动态识别

使用 USB 摄像头实现动态车牌识别,以实现实时检测功能,识别结果以弹窗显示实时数据流、以及终端打印置信度等。

### 流程图

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211654hryszuesrl8drycr.jpg)

### 代码

新建 `license_plate_recognition-CamUSB.py` 并添加如下代码

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from license_plate_recognition import PlateRecognizer
from PIL import Image, ImageDraw, ImageFont
import sys

# ---------- 汉字函数 ----------
def DrawPlateNum(img, plate_num, x1, y1):
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img_pil = Image.fromarray(img_rgb)
    draw = ImageDraw.Draw(img_pil)
    font = ImageFont.truetype("simsun.ttc", 32)   # 字体路径按需改
    draw.text((x1, y1 - 30), plate_num, font=font, fill=(0, 255, 0))
    return cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)

# ---------- 初始化识别器 ----------
recognizer = PlateRecognizer()          # 内部已加载 yolov8 + ocr

# ---------- 摄像头 ----------
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
if not cap.isOpened():
    sys.exit("无法打开摄像头")
ret, frame = cap.read()
if not ret:
    sys.exit("无法读取画面")
h, w = frame.shape[:2]

# ---------- 主循环 ----------
print("按 q 退出,实时车牌识别")
while True:
    ret, frame = cap.read()
    if not ret:
      break

    plates = recognizer.recognize(frame)   # 返回列表
    for p in plates:
      x1, y1, x2, y2 = p['bbox']
      cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
      # 用 PIL 显示汉字
      frame = DrawPlateNum(frame, p['text'], x1, y1)
      # 终端实时打印
      print(f"车牌: {p['text']}置信度: {p['score_text']:.4f}")
    cv2.imshow("Plate OCR", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break

cap.release()
cv2.destroyAllWindows()
```

- 右键该文件,选择使用 IDEL 编辑;
- 菜单栏选择 Run - Run Module 选项,运行程序;

> 或双击 `*.py` 文件运行。

### 效果

- 运行程序后弹出摄像头实时采集画面,自动标注车牌识别选框、文字和置信度

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211710sj05z580nc5smt5t.jpg)

- 同时终端打印识别结果,包括车牌号、置信度等信息,每帧识别结果均会刷新;

!(https://www.eefocus.com/forum/data/attachment/forum/202509/21/211724s7wowpc7wwelmcom.jpg)

## 总结

本文介绍了 AIMB-2210 研华 AMD 嵌入式主板实现 AI 视觉识别类相关应用:车牌识别,包括模型训练、板端推理、关键代码解析等,为该产品在 AI 视觉领域的快速开发和应用提供了参考。

<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=115253820068935&bvid=BV16bJ1zfEqj&cid=32619760809&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

页: [1]
查看完整版本: 【AIMB-2210研华AMD嵌入式主板】AI 视觉识别应用:车牌识别