【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]