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

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.rhkb.cn/news/16244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink KafkaConsumer offset是如何提交的

一、fllink 内部配置 client.id.prefix&#xff0c;指定用于 Kafka Consumer 的客户端 ID 前缀partition.discovery.interval.ms&#xff0c;定义 Kafka Source 检查新分区的时间间隔。 请参阅下面的动态分区检查一节register.consumer.metrics 指定是否在 Flink 中注册 Kafka…

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入&#xff0c;运行对应的宏即可&#xff1b;会先MSGBOX提示一下&#xff0c;然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…

网络工程师 (29)CSMA/CD协议

前言 CSMA/CD协议&#xff0c;即载波监听多路访问/碰撞检测&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;协议&#xff0c;是一种在计算机网络中&#xff0c;特别是在以太网环境下&#xff0c;用于管理多个设备共享同一物理传输介质的重要…

WPS中如何批量上下居中对齐word表格中的所有文字

大家好&#xff0c;我是小鱼。 在日常制作Word表格时&#xff0c;经常需要对表格中的内容进行排版。经常会把文字设置成左对齐、居中对齐或者是右对齐&#xff0c;这些对齐方式都比较好设置&#xff0c;有时制作的表格需要把文字批量上下居中对齐&#xff0c;轻松几步就可以搞…

GeekPad智慧屏编程控制

前面通过homeassistant和emqx一番折腾&#xff0c;已经可以控制GeekPad智慧屏的开关了。但是这中间用到的软件对环境依赖非常高&#xff0c;想再优化一下&#xff0c;把这两个工具都装到手机上&#xff0c;最后勉强实现了&#xff0c;但是还得借用模拟器和容器&#xff0c;稳定…

【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…

可编程网卡芯片在京东云网络的应用实践【BGW边界网关篇】

目录导览 文章背景 一.网关问题分析 BGW专线网关机器运维变更困难 BGW专线网关故障收敛链路复杂且长 BGW专线网关不具备异构架构下的灾备能力 BGW专线网关硬件资源成本居高不下 二.技术方案设计实现 网络拓扑规划与VIP架构升级 硬件实现与N-Tb流量平滑迁移 三.落地…

接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成

持续集成 概念&#xff1a; 团队成员将自己的工作成果&#xff0c;持续集成到一个公共平台的过程。成员可以每天集成一次&#xff0c;也可以一天集成多 次。 相关工具&#xff1a; 本地代码管理&#xff1a;git远程代码管理&#xff1a;gitee(国内)、github(国外)、gitlib(公司…

前端快速生成接口方法

大家好&#xff0c;我是苏麟&#xff0c;今天聊一下OpenApi。 官网 &#xff1a; umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录&#xff08;项目目录下&#xff09;创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…

三角测量——用相机运动估计特征点的空间位置

引入 使用对极约束估计了相机运动后&#xff0c;接下来利用相机运动估计特征点的空间位置&#xff0c;使用的方法就是三角测量。 三角测量 和对极几何中的对极几何约束描述类似&#xff1a; z 2 x 2 R ( z 1 x 1 ) t z_2x_2R(z_1x_1)t z2​x2​R(z1​x1​)t 经过对极约束…

WPS计算机二级•文档的文本样式与编号

听说这是目录哦 标题级别❤️新建文本样式 快速套用格式&#x1fa77;设置标题样式 自定义设置多级编号&#x1f9e1;使用自动编号&#x1f49b;取消自动编号&#x1f49a;设置 页面边框&#x1f499;添加水印&#x1fa75;排版技巧怎么分栏&#x1f49c;添加空白下划线&#x…

【编程实践】vscode+pyside6环境部署

1 PySide6简介 PySide6是Qt for Python的官方版本&#xff0c;支持Qt6&#xff0c;提供Python访问Qt框架的接口。优点包括官方支持、LGPL许可&#xff0c;便于商业应用&#xff0c;与Qt6同步更新&#xff0c;支持最新特性。缺点是相比PyQt5&#xff0c;社区资源较少。未来发展…

soular基础教程-使用指南

soular是TikLab DevOps工具链的统一帐号中心&#xff0c;今天来介绍如何使用 soular 配置你的组织、工作台&#xff0c;快速入门上手。 &#xfeff; 1. 账号管理 可以对账号信息进行多方面管理&#xff0c;包括分配不同的部门、用户组等&#xff0c;从而确保账号权限和职责…

访问Elasticsearch服务 curl ip 端口可以 浏览器不可以

LINUX学习 在虚拟机上面的linux上面用docker 部署Elasticsearch项目后&#xff0c;在linux系统内部用curl ip 端口地址的形式可以访问到Elasticsearch。可以返回数据。 但是在本机的浏览器中输入ip 端口&#xff0c;会报错&#xff0c;找不到服务。 ping 和 trelnet均不通。 …

防火墙安全综合实验

防火墙安全综合实验 一、拓扑信息 二、需求及配置 实验步骤 需求一&#xff1a;根据下表&#xff0c;完成相关配置 设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List&#xff1a;10 20Trunk 1、创建vlan10和vlan20 2、将接口划分到对应…

通过客户端Chatbox或OpenwebUI访问识别不到本地ollama中的模型等问题的解决

Chatbox和Open WebUI 等无法获取到 Ollama里的模型&#xff0c;主要是由以下原因导致&#xff1a; Ollama 服务未正确暴露给 Docker 容器或客户端模型未正确下载或名称不匹配网络配置或权限问题 排查以上问题的思路首先排查ollama服务是否启动&#xff0c;然后再看端口号 使…

vue-点击生成动态值,动态渲染回显输入框

1.前言 动态点击生成数值&#xff0c;回显输入框&#xff0c;并绑定。 2.实现 <template><div style"display:flex;align-items: center;flex-direction:row"><a-input:key"inputKey"v-model"uploadData[peo.field]"placehold…

deepseek大模型集成到idea

1 下载插件 安装CodeGPT打开 IntelliJ IDEA&#xff0c;鼠标点击左上角导航栏&#xff0c;File --> Setting 2 申请API key 3 配置deepseek 在 Settings 界面中的搜索框中&#xff0c;搜索 CodeGPT&#xff0c;路径 Tools --> CodeGPT --> Providers --> 如下一…

C++引用深度详解

C引用深度详解 前言1. 引用的本质与核心特性1.1 引用概念1.2 核心特性 2. 常引用与权限控制2.1 权限传递规则2.2 常量引用2.3 临时变量保护1. 样例2. 样例3. 测试 三、引用使用场景分析3.1 函数参数传递输出型参数避免多级指针高效传参 3.2 做函数返回值正确使用危险案例 4. 性…

npm运行Vue项目报错 error:0308010c:digital envelope routines::unsupported

大家好&#xff0c;我是 程序员码递夫。 问题 VSCode 运行Vue项目&#xff0c;提示错误&#xff1a; building 2/2 modules 0 activeError: error:0308010c:digital envelope routines::unsupported 解决方法 原因是 npm 高版本(大于17)&#xff0c;对ssl的处理做了改进&…