[特殊字符] 基于 FastAPI 和 React 构建车牌号识别网站

devtools/2025/2/12 22:27:44/

1. 项目概述

在本项目中,我们将构建一个 车牌号识别网站,用户可以上传车辆图片,系统会通过 OCR 车牌识别模型(PaddleOCR / HyperLPR) 提取车牌号码,并将结果展示到前端。同时,用户可以选择不同的 OCR 模型,并查看识别历史记录。


2. 网站功能需求

✅ 核心功能

  1. 图片上传 📷 - 用户上传包含车牌的图片
  2. 车牌号识别 🔍 - 通过 OCR 识别车牌号
  3. 模型选择 🏷 - 用户可切换 PaddleOCR / HyperLPR
  4. 结果展示 📜 - 前端显示识别结果
  5. 识别历史 🕒 - 存储识别记录,用户可查看历史
  6. API 支持 🖥 - 提供 RESTful API,支持前后端交互

🎨 扩展功能

  • 数据库存储 - 使用 MySQL 存储识别记录
  • 用户权限管理 - 采用 JWT 进行认证
  • 批量上传 - 允许用户一次上传多张图片并识别

3. 技术选型

🖥️ 后端(FastAPI)

  • FastAPI - Python 的轻量级 Web 框架,支持异步、高性能 API 开发
  • PaddleOCR / HyperLPR - 车牌识别 OCR
  • MySQL - 存储用户识别记录
  • SQLAlchemy - ORM 进行数据库管理
  • JWT / OAuth2 - 用户认证

🌐 前端(React)

  • React + Vite - 现代前端框架,提供快速交互体验
  • Ant Design - 美观的 UI 组件库
  • Axios - 进行 API 请求

4. 项目架构

car-plate-recognition/
├── backend/                # FastAPI 后端
│   ├── main.py             # FastAPI 入口
│   ├── models.py           # 数据库模型
│   ├── routes/             # API 路由
│   │   ├── ocr.py          # 车牌识别 API
│   │   ├── auth.py         # 用户认证 API
│   │   ├── history.py      # 识别历史 API
│   ├── services/           # 业务逻辑
│   │   ├── ocr_service.py  # OCR 识别处理
│   ├── database.py         # 数据库连接
│   ├── config.py           # 配置文件
│   ├── requirements.txt    # 依赖库
│   ├── Dockerfile          # 容器化部署
├── frontend/               # React 前端
│   ├── src/
│   │   ├── components/     # 组件
│   │   ├── pages/          # 页面
│   │   ├── services/       # API 请求
│   │   ├── App.tsx         # 入口
│   │   ├── index.tsx       # 渲染入口
│   ├── package.json        # 前端依赖
│   ├── vite.config.ts      # Vite 配置
├── docker-compose.yml      # 一键部署

5. FastAPI 后端开发

5.1 安装依赖

pip install fastapi uvicorn paddleocr hyperlpr mysql-connector-python sqlalchemy python-multipart pydantic jwt

5.2 配置 FastAPI 入口

backend/main.py

from fastapi import FastAPI
from routes import ocr, auth, history
from database import engine, Base# 初始化数据库
Base.metadata.create_all(bind=engine)app = FastAPI()# 注册 API 路由
app.include_router(ocr.router)
app.include_router(auth.router)
app.include_router(history.router)@app.get("/")
async def root():return {"message": "车牌识别 API"}

5.3 车牌识别 API

backend/routes/ocr.py

from fastapi import APIRouter, UploadFile, File, Form
from services.ocr_service import process_image
import shutil
import osrouter = APIRouter(prefix="/ocr", tags=["OCR"])UPLOAD_FOLDER = "uploads"@router.post("/recognize")
async def recognize_license_plate(file: UploadFile = File(...),model: str = Form("paddleocr")  # 默认使用 PaddleOCR
):file_path = f"{UPLOAD_FOLDER}/{file.filename}"# 保存上传的图片with open(file_path, "wb") as buffer:shutil.copyfileobj(file.file, buffer)# 进行 OCR 识别plate_number = process_image(file_path, model)return {"filename": file.filename, "plate_number": plate_number, "model": model}

5.4 车牌识别服务

backend/services/ocr_service.py

from paddleocr import PaddleOCR
from hyperlpr import HyperLPR
import cv2ocr_paddle = PaddleOCR(use_angle_cls=True, lang="ch")def process_image(image_path: str, model: str):image = cv2.imread(image_path)if model == "paddleocr":result = ocr_paddle.ocr(image_path, cls=True)plate_number = result[0][0][1][0] if result else "未识别"elif model == "hyperlpr":result = HyperLPR().Run(image)plate_number = result[0][0] if result else "未识别"return plate_number

6. React 前端开发

6.1 创建 React 项目

npx create-vite@latest frontend --template react-ts
cd frontend
npm install antd axios

6.2 车牌识别页面

frontend/src/pages/OCRPage.tsx

import React, { useState } from "react";
import { Upload, Button, Select, message } from "antd";
import axios from "axios";const OCRPage: React.FC = () => {const [image, setImage] = useState<File | null>(null);const [model, setModel] = useState("paddleocr");const [result, setResult] = useState("");const handleUpload = async () => {if (!image) {message.error("请上传图片!");return;}const formData = new FormData();formData.append("file", image);formData.append("model", model);const response = await axios.post("http://localhost:8000/ocr/recognize", formData);setResult(response.data.plate_number);};return (<div><h2>车牌识别</h2><Upload beforeUpload={(file) => { setImage(file); return false; }}><Button>上传图片</Button></Upload><Select value={model} onChange={setModel} style={{ width: 200 }}><Select.Option value="paddleocr">PaddleOCR</Select.Option><Select.Option value="hyperlpr">HyperLPR</Select.Option></Select><Button onClick={handleUpload} type="primary">识别</Button><h3>识别结果: {result}</h3></div>);
};export default OCRPage;

7. 运行与部署

7.1 启动后端

uvicorn main:app --reload --host 0.0.0.0 --port 8000

7.2 启动前端

cd frontend
npm run dev

7.3 Docker 部署

docker-compose.yml

version: '3.8'
services:backend:build: ./backendports:- "8000:8000"frontend:build: ./frontendports:- "3000:3000"
docker-compose up -d

8. 结论

🎯 基于 FastAPI + React + PaddleOCR/HyperLPR 构建车牌号识别网站
支持上传图片并自动识别车牌
支持多种 OCR 车牌识别模型
支持 API 交互,前后端分离
支持数据库存储识别历史
可容器化部署,支持 Docker

🚀 完整的车牌识别网站搭建完成! 🚗💨


http://www.ppmy.cn/devtools/158324.html

相关文章

Linux | 系统调用

文章目录 Linux | 系统调用open 系统调用功能头文件和函数原型参数解释返回值示例代码 其他常用系统调用read 系统调用write 系统调用close 系统调用lseek 系统调用stat 系统调用 Linux | 系统调用 前言&#xff1a;在Linux系统中&#xff0c;系统调用是用户空间程序与内核进行…

rpx和px混用方案

&#xff08;1&#xff09;创建一个全局的样式配置文件&#xff1a; // styles/variables.scss :root {// 基础字体大小--font-size-xs: 12px;--font-size-sm: 14px;--font-size-md: 16px;--font-size-lg: 18px;// 响应式间距--spacing-xs: 5px;--spacing-sm: 10px;--spacing-…

测试用例作用

测试用例在软件开发过程中扮演着非常重要的角色&#xff0c;指导测试人员如何去测&#xff0c;测试用例的好坏直接关乎到软件本身的质量。主要体现在以下几个方面&#xff1a; 1. 明确测试目标&#xff1a;测试用例详细描述了需要测试的功能点和预期结果&#xff0c;确保每个功…

React 高级教程

使用 React 高级组件(HOC)实现的完整项目示例,包含权限控制、数据加载状态处理、性能优化等常见高级功能。创建一个简单的博客系统: // 项目结构: src/ |-- components/ | |-- ArticleList.jsx | |-- Article.jsx | |-- Header.jsx | |-- LoginForm.jsx | |-- U…

【人工智能】解码语言之谜:使用Python构建神经机器翻译系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 神经机器翻译(NMT)是近年来机器翻译领域的一项重大突破。它利用深度学习模型,特别是循环神经网络(RNN)和Transformer网络,以端到端的…

KOA优化LSBooST回归预测matlab

开普勒优化算法&#xff08;简称 KOA&#xff0c;即 Kepler Optimization Algorithm&#xff09;&#xff0c;是一种从开普勒行星运动规律中汲取灵感的元启发式算法。此算法模拟行星在不同时刻的位置与速度&#xff0c;每个行星象征着一个候选解&#xff0c;在优化进程中&#…

c/c++蓝桥杯经典编程题100道(9)数组排序

数组排序 ->返回c/c蓝桥杯经典编程题100道-目录 目录 数组排序 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;冒泡排序&#xff08;难度★&#xff09; 解法2&#xff1a;选择排序&#xff08;难度★&#xff09; 解法3&#xff1a;快速排序&#…

基于生成式语言模型的就业指导

一、引言 在当今竞争激烈的就业市场中&#xff0c;求职者面临着诸多挑战&#xff0c;如职业规划迷茫、简历撰写困难、面试准备不足等。生成式语言模型&#xff0c;如ChatGPT等&#xff0c;凭借其强大的语言理解和生成能力&#xff0c;为求职者提供了全新的就业指导途径。本指导…