基于YOLOv8/YOLOv10/YOLOv11/YOLOv12与SpringBoot的麻将识别检测系统(DeepSeek智能分析+web交互界面+前后端分离+YOLO数据)
摘要
随着中国传统智力游戏数字化发展的深入推进,麻将作为极具代表性的国粹文化,其智能化识别与分析技术具有重要的应用价值。本研究设计并实现了一套基于深度学习与现代化Web架构的麻将牌智能识别系统,专门针对42种标准麻将牌型进行高精度检测与分类。系统创新性地集成了YOLOv8、YOLOv10、YOLOv11和YOLOv12四种先进的目标检测模型,构建了可灵活切换的多模型识别引擎。通过构建包含6731张高质量标注图像的专用麻将数据集,涵盖了万、条、筒、风牌、箭牌等各类牌型,为模型的精准训练提供了可靠数据支撑。后端采用SpringBoot微服务框架,结合前后端分离架构,实现了完整的用户管理体系、多模态检测功能和智能分析模块。特别引入DeepSeek大型语言模型,为识别结果提供牌局分析。所有检测记录与操作数据均持久化存储于MySQL数据库,确保了系统的可追溯性和数据安全性。实验结果表明,本系统在复杂背景、多牌重叠及不同光照条件下均能保持优异的识别性能,为在线麻将游戏、智能教学、文化传承及娱乐应用等领域提供了创新的技术解决方案。
关键词: 麻将识别;YOLO系列算法;目标检测;SpringBoot;DeepSeek;智能分析;文化数字化;Web应用系统
目录
详细功能展示视频
基于深度学习的麻将识别检测系统(DeepSeek智能分析+YOLOv8/YOLOv10/YOLOv11/YOLOv12+最新web界面 +前后端分离)_哔哩哔哩_bilibili
基于深度学习的麻将识别检测系统(DeepSeek智能分析+YOLOv8/YOLOv10/YOLOv11/YOLOv12+最新web界面 +前后端分离)_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1XjkuBDEut/?vd_source=549d0b4e2b8999929a61a037fcce3b0fhttps://www.bilibili.com/video/BV1XjkuBDEut/
一、引言
1. 研究背景与意义
麻将作为中国传统文化的瑰宝,拥有超过千年的历史,在全球范围内享有广泛的群众基础。随着数字化时代的到来,麻将的智能化识别与分析技术展现出巨大的应用潜力。在娱乐产业领域,自动化的麻将牌识别可以推动在线麻将游戏的智能化升级;在教育传承方面,可以为初学者提供实时的牌局分析和指导;在文化研究领域,有助于麻将文化的数字化保存与传播;在竞技比赛中,能够实现自动计分和规则监督。
然而,麻将牌的自动识别面临诸多技术挑战:牌面种类繁多(通常包含42种基本牌型)、图案复杂且相似度高、背景环境多变、牌面可能存在旋转和部分遮挡等。传统的人工识别或基于简单图像处理的方法难以满足实时性、准确性和鲁棒性的综合要求,迫切需要引入先进的计算机视觉技术来解决这些问题。
2. 国内外研究现状
在麻将牌识别领域,早期研究主要依赖于传统的图像处理技术,如颜色分割、模板匹配和特征点检测等方法。这些方法在理想条件下有一定效果,但对光照变化、视角变化和复杂背景的适应性较差。随着深度学习技术的发展,基于卷积神经网络的方法逐渐成为主流,通过端到端的学习方式显著提升了识别性能。
YOLO系列算法以其优异的实时性能和检测精度,在多个目标检测领域取得了成功应用。从YOLOv1到最新的YOLOv12,算法通过持续优化网络结构、特征融合机制和训练策略,不断突破检测精度与速度的平衡点。然而,针对麻将牌这种具有复杂纹理和相似类别的小目标检测任务,如何选择合适的YOLO变体并进行针对性优化,仍需深入研究。
3. 本项目研究内容与创新点
本项目构建了一个集成多种先进技术的麻将牌智能识别系统,主要创新点包括:
-
专业化麻将数据集构建:针对42种标准麻将牌型构建了包含6731张高质量图像的数据集,涵盖万子(1-9万)、条子(1-9条)、筒子(1-9筒)、风牌(东、南、西、北)、箭牌(中、发、白)等所有常见牌型,包含了不同光照、角度、背景和摆放状态的变化。
-
多版本YOLO模型综合评估:首次在同一系统中集成YOLOv8、YOLOv10、YOLOv11和YOLOv12四种先进模型,通过系统性对比实验,为麻将识别这一特定任务提供了详尽的性能评估和选择依据。
-
DeepSeek增强的智能分析功能:创新性地将视觉识别与大语言模型相结合,系统不仅能够识别牌面,还能通过DeepSeek模型提供深度语义理解。
-
完整的业务系统实现:采用SpringBoot+Vue.js的前后端分离架构,实现了从用户管理、多模态检测(图像、视频、实时摄像头)、数据可视化到智能分析的完整业务流程。
二、系统概述
本项目旨在构建一个高效、准确、易用的麻将牌智能识别平台,将最先进的深度学习算法与现代Web开发技术相结合,为麻将相关的多个应用场景提供全面的技术支持。
1. 核心检测能力
-
全面牌型覆盖:系统能够准确识别42种标准麻将牌,包括万、条、筒的数字牌(1-9)和风牌、箭牌等特殊牌型。
-
复杂场景适应:针对麻将桌面的典型环境(如绿色桌面、复杂背景、多牌重叠、光线变化等)进行了专门优化。
-
多角度识别:支持不同拍摄角度下的牌面识别,包括俯视、斜视等多种视角。
2. 系统功能特色
-
智能牌局分析:通过DeepSeek大模型,系统可以提供基于当前牌面的深度分析。
-
多模态交互设计:提供直观的Web界面,支持图片上传、实时摄像头、视频文件等多种输入方式,适应不同的使用场景。
-
教学辅助功能:针对麻将初学者,系统可以提供牌局解说、规则提示、策略建议等教学辅助功能。
-
文化展示模块:集成麻将文化介绍、规则说明、历史渊源等文化展示内容,促进传统文化的传播。
-
性能监控与管理:系统内置详细的性能监控和日志记录功能,便于运维管理和性能优化。
二、 系统核心特性概述
功能模块
✅ 用户登录注册:支持密码检测,保存到MySQL数据库。
✅ 支持四种YOLO模型切换,YOLOv8、YOLOv10、YOLOv11、YOLOv12。
✅ 信息可视化,数据可视化。
✅ 图片检测支持AI分析功能,deepseek
✅ 支持图像检测、视频检测和摄像头实时检测,检测结果保存到MySQL数据库。
✅ 图片识别记录管理、视频识别记录管理和摄像头识别记录管理。
✅ 用户管理模块,管理员可以对用户进行增删改查。
✅ 个人中心,可以修改自己的信息,密码姓名头像等等。
登录注册模块


可视化模块


图像检测模块
-
YOLO模型集成 (v8/v10/v11/v12)
-
DeepSeek多模态分析
-
支持格式:JPG/PNG/MP4/RTSP


视频检测模块

实时检测模块

图片识别记录管理


视频识别记录管理


摄像头识别记录管理


用户管理模块



数据管理模块(MySQL表设计)
-
users- 用户信息表

-
imgrecords- 图片检测记录表

-
videorecords- 视频检测记录表

-
camerarecords- 摄像头检测记录表

模型训练结果
#coding:utf-8
#根据实际情况更换模型
# yolon.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。
# yolos.yaml (small):小模型,适合实时任务。
# yolom.yaml (medium):中等大小模型,兼顾速度和精度。
# yolob.yaml (base):基本版模型,适合大部分应用场景。
# yolol.yaml (large):大型模型,适合对精度要求高的任务。
from ultralytics import YOLO
model_path = 'pt/yolo12s.pt'
data_path = 'data.yaml'
if __name__ == '__main__':
model = YOLO(model_path)
results = model.train(data=data_path,
epochs=500,
batch=64,
device='0',
workers=0,
project='runs',
name='exp',
)










YOLO概述

YOLOv8
YOLOv8 由 Ultralytics 于 2023 年 1 月 10 日发布,在准确性和速度方面提供了尖端性能。基于先前 YOLO 版本的进步,YOLOv8 引入了新功能和优化,使其成为各种应用中目标检测任务的理想选择。

YOLOv8 的主要特性
- 高级骨干和颈部架构: YOLOv8 采用最先进的骨干和颈部架构,从而改进了特征提取和目标检测性能。
- 无锚点分离式 Ultralytics Head: YOLOv8 采用无锚点分离式 Ultralytics head,与基于锚点的方法相比,这有助于提高准确性并提高检测效率。
- 优化的准确性-速度权衡: YOLOv8 专注于在准确性和速度之间保持最佳平衡,适用于各种应用领域中的实时对象检测任务。
- 丰富的预训练模型: YOLOv8提供了一系列预训练模型,以满足各种任务和性能要求,使您更容易为特定用例找到合适的模型。
YOLOv10
YOLOv10 由 清华大学研究人员基于 Ultralytics Python构建,引入了一种新的实时目标检测方法,解决了先前 YOLO 版本中存在的后处理和模型架构缺陷。通过消除非极大值抑制 (NMS) 并优化各种模型组件,YOLOv10 以显著降低的计算开销实现了最先进的性能。大量实验表明,它在多个模型尺度上都具有卓越的精度-延迟权衡。

概述
实时目标检测旨在以低延迟准确预测图像中的对象类别和位置。YOLO 系列因其在性能和效率之间的平衡而一直处于这项研究的前沿。然而,对 NMS 的依赖和架构效率低下阻碍了最佳性能。YOLOv10 通过引入用于无 NMS 训练的一致双重分配和整体效率-准确性驱动的模型设计策略来解决这些问题。
架构
YOLOv10 的架构建立在之前 YOLO 模型优势的基础上,同时引入了几项关键创新。该模型架构由以下组件组成:
- 骨干网络:负责特征提取,YOLOv10 中的骨干网络使用增强版的 CSPNet (Cross Stage Partial Network),以改善梯度流并减少计算冗余。
- Neck:Neck 的设计目的是聚合来自不同尺度的特征,并将它们传递到 Head。它包括 PAN(路径聚合网络)层,用于有效的多尺度特征融合。
- One-to-Many Head:在训练期间为每个对象生成多个预测,以提供丰富的监督信号并提高学习准确性。
- 一对一头部:在推理时为每个对象生成一个最佳预测,以消除对NMS的需求,从而降低延迟并提高效率。
主要功能
- 免NMS训练:利用一致的双重分配来消除对NMS的需求,从而降低推理延迟。
- 整体模型设计:从效率和准确性的角度对各种组件进行全面优化,包括轻量级分类 Head、空间通道解耦下采样和秩引导块设计。
- 增强的模型功能: 结合了大内核卷积和部分自注意力模块,以提高性能,而无需显着的计算成本。
YOLOv11
YOLO11 是 Ultralytics YOLO 系列实时目标检测器的最新迭代版本,它以前沿的精度、速度和效率重新定义了可能性。YOLO11 在之前 YOLO 版本的显著进步基础上,在架构和训练方法上进行了重大改进,使其成为各种计算机视觉任务的多功能选择。

主要功能
- 增强的特征提取: YOLO11 采用改进的 backbone 和 neck 架构,从而增强了特征提取能力,以实现更精确的目标检测和复杂的任务性能。
- 优化效率和速度: YOLO11 引入了改进的架构设计和优化的训练流程,从而提供更快的处理速度,并在精度和性能之间保持最佳平衡。
- 更高精度,更少参数: 随着模型设计的进步,YOLO11m 在 COCO 数据集上实现了更高的 平均精度均值(mAP),同时比 YOLOv8m 少用 22% 的参数,在不牺牲精度的情况下提高了计算效率。
- 跨环境的适应性: YOLO11 可以无缝部署在各种环境中,包括边缘设备、云平台和支持 NVIDIA GPU 的系统,从而确保最大的灵活性。
- 广泛支持的任务范围: 无论是目标检测、实例分割、图像分类、姿势估计还是旋转框检测 (OBB),YOLO11 都旨在满足各种计算机视觉挑战。
Ultralytics YOLO11 在其前代产品的基础上进行了多项重大改进。主要改进包括:
- 增强的特征提取: YOLO11 采用了改进的骨干网络和颈部架构,增强了特征提取能力,从而实现更精确的目标检测。
- 优化的效率和速度: 改进的架构设计和优化的训练流程提供了更快的处理速度,同时保持了准确性和性能之间的平衡。
- 更高精度,更少参数: YOLO11m 在 COCO 数据集上实现了更高的平均 精度均值 (mAP),同时比 YOLOv8m 少用 22% 的参数,在不牺牲精度的情况下提高了计算效率。
- 跨环境的适应性: YOLO11 可以部署在各种环境中,包括边缘设备、云平台和支持 NVIDIA GPU 的系统。
- 广泛支持的任务范围: YOLO11 支持各种计算机视觉任务,例如目标检测、实例分割、图像分类、姿势估计和旋转框检测 (OBB)。
YOLOv12
YOLO12引入了一种以注意力为中心的架构,它不同于之前YOLO模型中使用的传统基于CNN的方法,但仍保持了许多应用所需的实时推理速度。该模型通过在注意力机制和整体网络架构方面的新颖方法创新,实现了最先进的目标检测精度,同时保持了实时性能。尽管有这些优势,YOLO12仍然是一个社区驱动的版本,由于其沉重的注意力模块,可能表现出训练不稳定、内存消耗增加和CPU吞吐量较慢的问题,因此Ultralytics仍然建议将YOLO11用于大多数生产工作负载。
主要功能
- 区域注意力机制: 一种新的自注意力方法,可以有效地处理大型感受野。它将 特征图 分成 l 个大小相等的区域(默认为 4 个),水平或垂直,避免复杂的运算并保持较大的有效感受野。与标准自注意力相比,这大大降低了计算成本。
- 残差高效层聚合网络(R-ELAN):一种基于 ELAN 的改进的特征聚合模块,旨在解决优化挑战,尤其是在更大规模的以注意力为中心的模型中。R-ELAN 引入:
- 具有缩放的块级残差连接(类似于层缩放)。
- 一种重新设计的特征聚合方法,创建了一个类似瓶颈的结构。
- 优化的注意力机制架构:YOLO12 精简了标准注意力机制,以提高效率并与 YOLO 框架兼容。这包括:
- 使用 FlashAttention 来最大限度地减少内存访问开销。
- 移除位置编码,以获得更简洁、更快速的模型。
- 调整 MLP 比率(从典型的 4 调整到 1.2 或 2),以更好地平衡注意力和前馈层之间的计算。
- 减少堆叠块的深度以改进优化。
- 利用卷积运算(在适当的情况下)以提高其计算效率。
- 在注意力机制中添加一个7x7可分离卷积(“位置感知器”),以隐式地编码位置信息。
- 全面的任务支持: YOLO12 支持一系列核心计算机视觉任务:目标检测、实例分割、图像分类、姿势估计和旋转框检测 (OBB)。
- 增强的效率: 与许多先前的模型相比,以更少的参数实现了更高的准确率,从而证明了速度和准确率之间更好的平衡。
- 灵活部署: 专为跨各种平台部署而设计,从边缘设备到云基础设施。
主要改进
-
增强的 特征提取:
- 区域注意力: 有效处理大型感受野,降低计算成本。
- 优化平衡: 改进了注意力和前馈网络计算之间的平衡。
- R-ELAN:使用 R-ELAN 架构增强特征聚合。
-
优化创新:
- 残差连接:引入具有缩放的残差连接以稳定训练,尤其是在较大的模型中。
- 改进的特征集成:在 R-ELAN 中实现了一种改进的特征集成方法。
- FlashAttention: 整合 FlashAttention 以减少内存访问开销。
-
架构效率:
- 减少参数:与之前的许多模型相比,在保持或提高准确性的同时,实现了更低的参数计数。
- 简化的注意力机制:使用简化的注意力实现,避免了位置编码。
- 优化的 MLP 比率:调整 MLP 比率以更有效地分配计算资源。
前端代码展示

前端登录界面一小部分代码:
<template>
<div class="login-container">
<!-- 麻将背景 -->
<div class="mahjong-background">
<!-- 麻将粒子 -->
<div class="mahjong-particles">
<div class="particle" v-for="n in 30" :key="`particle-${n}`" :style="getParticleStyle(n)">
<div class="particle-glow"></div>
</div>
</div>
<!-- 麻将牌漂浮 -->
<div class="mahjong-floating">
<div class="tile" v-for="n in 15" :key="`tile-${n}`" :style="getTileStyle(n)">
{{ getRandomTile() }}
</div>
</div>
<!-- 连接网格 -->
<div class="detection-grid">
<div class="grid-node" v-for="n in 25" :key="`node-${n}`" :style="getNodeStyle(n)">
<div class="node-pulse"></div>
</div>
</div>
<!-- 麻将图案云 -->
<div class="pattern-cloud">
<div class="pattern" v-for="n in 12" :key="`pattern-${n}`" :style="getPatternStyle(n)">
{{ ['🀄','🀙','🀡','🀐','🀘','🀇','🀏'][Math.floor(Math.random() * 7)] }}
</div>
</div>
<!-- 扫描线 -->
<div class="detection-scan">
<div class="scan-line" v-for="n in 6" :key="`scan-${n}`" :style="getScanStyle(n)">
<div class="scan-path"></div>
</div>
</div>
</div>
<!-- 登录主容器 -->
<div class="login-main">
<!-- 检测界面容器 -->
<div class="detection-container">
<div class="detection-effect">
<div class="scan-pulse"></div>
<div class="detection-lines"></div>
</div>
<!-- 系统标志 -->
<div class="system-brand">
<div class="brand-icon">
<div class="mahjong-icon">
<div class="tile-structure">
<div class="tile-outline"></div>
<div class="tile-dot dot-1"></div>
<div class="tile-dot dot-2"></div>
<div class="tile-dot dot-3"></div>
<div class="tile-symbol">🀄</div>
</div>
<div class="mahjong-aura"></div>
</div>
<div class="icon-glow"></div>
</div>
<div class="brand-text">
<h1 class="system-title">
<span class="mahjong-text">Mahjong</span>
<span class="detection-text">Detection</span>
</h1>
<p class="system-subtitle">智能麻将识别分析系统</p>
<p class="company-tag">深度视觉计算 · AI识别实验室</p>
</div>
</div>
<!-- 登录面板 -->
<div class="login-panel">
<div class="panel-header">
<div class="header-line"></div>
<h2>系统登录</h2>
<div class="header-line"></div>
</div>
<div class="panel-content">
<el-form :model="ruleForm" :rules="registerRules" ref="ruleFormRef">
<!-- 用户名输入 -->
<el-form-item prop="username">
<div class="input-field">
<div class="field-icon">
<div class="scan-icon"></div>
</div>
<el-input
v-model="ruleForm.username"
placeholder="请输入操作员ID"
class="detection-input"
size="large"
@focus="onInputFocus"
@blur="onInputBlur"
/>
<div class="field-glow"></div>
</div>
<div class="input-hint">麻将分析师身份验证</div>
</el-form-item>
<!-- 密码输入 -->
<el-form-item prop="password">
<div class="input-field">
<div class="field-icon">
<div class="secure-icon"></div>
</div>
<el-input
v-model="ruleForm.password"
type="password"
placeholder="请输入系统密钥"
show-password
class="detection-input"
size="large"
@focus="onInputFocus"
@blur="onInputBlur"
/>
<div class="field-glow"></div>
</div>
<div class="input-hint">安全访问验证...</div>
</el-form-item>
<!-- 登录按钮 -->
<el-form-item>
<div class="login-action">
<el-button
type="primary"
class="detection-btn"
@click="submitForm(ruleFormRef)"
@mouseenter="onBtnHover"
@mouseleave="onBtnLeave"
>
<div class="btn-content">
<div class="btn-text">
<span class="text-main">启动麻将识别</span>
<span class="text-sub">MAHJONG SCAN</span>
</div>
<div class="btn-scan">
<div class="scan-dot"></div>
<div class="scan-dot"></div>
<div class="scan-dot"></div>
</div>
</div>
<div class="btn-energy"></div>
<div class="btn-particles">
<div class="particle" v-for="n in 3" :key="`btn-particle-${n}`"></div>
</div>
</el-button>
<div class="system-status">
<div class="status-indicator">
<div class="status-dot active"></div>
<span>识别系统就绪</span>
</div>
<div class="status-info">
<span>v3.1.5 • 深度视觉模式</span>
</div>
</div>
</div>
</el-form-item>
</el-form>
<!-- 辅助选项 -->
<div class="panel-options">
<router-link to="/register" class="option-link">
<div class="link-icon">
<div class="mahjong-plus"></div>
</div>
<span>注册新账户</span>
<div class="link-trail"></div>
</router-link>
</div>
</div>
</div>
<!-- 系统信息 -->
<div class="system-info">
<div class="info-grid">
<div class="info-item">
<div class="info-icon tile-icon-info"></div>
</div>
<div class="info-item">
<div class="info-icon speed-icon"></div>
<div class="info-content">
<span class="info-label">识别速度</span>
<span class="info-value">50ms</span>
</div>
</div>
<div class="info-item">
<div class="info-icon accuracy-icon"></div>
<div class="info-content">
<span class="info-label">识别精度</span>
<span class="info-value">99.8%</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 背景装饰元素 -->
<div class="background-elements">
<!-- 麻将数据流 -->
<div class="mahjong-stream">
<div class="data-flow" v-for="n in 8" :key="`flow-${n}`" :style="getStreamStyle(n)">
<span v-for="i in 15" :key="`data-${n}-${i}`">
{{ ['🀇','🀈','🀉','🀊','🀋','🀌','🀍','🀎','🀏','🀙','🀚','🀛','🀜','🀝','🀞','🀟','🀠','🀡','🀐','🀑','🀒','🀓','🀔','🀕','🀖','🀗','🀘','🀆','🀅','🀄'][Math.floor(Math.random() * 30)] }}
</span>
</div>
</div>
<!-- 浮动麻将术语 -->
<div class="floating-terms">
<div class="floating-term" v-for="n in 10" :key="`term-${n}`" :style="getTermStyle(n)">
{{ ['碰','杠','胡','吃','听','番','万','条','筒','风'][Math.floor(Math.random() * 10)] }}
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, computed, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { ElMessage } from 'element-plus';
import { useI18n } from 'vue-i18n';
import Cookies from 'js-cookie';
import { storeToRefs } from 'pinia';
import { useThemeConfig } from '/@/stores/themeConfig';
import { initFrontEndControlRoutes } from '/@/router/frontEnd';
import { initBackEndControlRoutes } from '/@/router/backEnd';
import { Session } from '/@/utils/storage';
import { formatAxis } from '/@/utils/formatTime';
import { NextLoading } from '/@/utils/loading';
import type { FormInstance, FormRules } from 'element-plus';
import request from '/@/utils/request';
// 定义变量内容
const { t } = useI18n();
const storesThemeConfig = useThemeConfig();
const { themeConfig } = storeToRefs(storesThemeConfig);
const route = useRoute();
const router = useRouter();
const formSize = ref('default');
const ruleFormRef = ref<FormInstance>();
// 定义表单数据
const ruleForm = reactive({
username: '',
password: '',
});
// 校验规则
const registerRules = reactive<FormRules>({
username: [
{ required: true, message: '请输入操作员ID', trigger: 'blur' },
{ min: 3, max: 20, message: '长度在3-20个字符', trigger: 'blur' },
],
password: [
{ required: true, message: '请输入系统密钥', trigger: 'blur' },
{ min: 5, max: 30, message: '长度在5-30个字符', trigger: 'blur' },
],
});
// 粒子样式
const getParticleStyle = (index: number) => {
const left = Math.random() * 100;
const top = Math.random() * 100;
const size = 4 + Math.random() * 8;
const duration = 3 + Math.random() * 4;
const delay = Math.random() * 2;
const colorIndex = Math.floor(Math.random() * 3);
const colors = ['#FF9F1C', '#2EC4B6', '#E71D36'];
return {
left: `${left}%`,
top: `${top}%`,
width: `${size}px`,
height: `${size}px`,
backgroundColor: colors[colorIndex],
animationDuration: `${duration}s`,
animationDelay: `${delay}s`
};
};
// 麻将牌样式
const getTileStyle = (index: number) => {
const left = Math.random() * 100;
const top = Math.random() * 100;
const size = 40 + Math.random() * 60;
const duration = 15 + Math.random() * 20;
const delay = Math.random() * 5;
const rotation = Math.random() * 360;
return {
left: `${left}%`,
top: `${top}%`,
width: `${size}px`,
height: `${size * 1.3}px`,
fontSize: `${size * 0.8}px`,
animationDuration: `${duration}s`,
animationDelay: `${delay}s`,
transform: `rotate(${rotation}deg)`,
lineHeight: `${size * 1.3}px`
};
};
// 获取随机麻将牌
const getRandomTile = () => {
const tiles = ['🀇','🀈','🀉','🀊','🀋','🀌','🀍','🀎','🀏','🀙','🀚','🀛','🀜','🀝','🀞','🀟','🀠','🀡','🀐','🀑','🀒','🀓','🀔','🀕','🀖','🀗','🀘','🀆','🀅','🀄'];
return tiles[Math.floor(Math.random() * tiles.length)];
};
// 节点样式
const getNodeStyle = (index: number) => {
const left = Math.random() * 100;
const top = Math.random() * 100;
const size = 6 + Math.random() * 12;
const duration = 2 + Math.random() * 3;
const delay = Math.random() * 2;
return {
left: `${left}%`,
top: `${top}%`,
width: `${size}px`,
height: `${size}px`,
animationDuration: `${duration}s`,
animationDelay: `${delay}s`
};
};
// 图案样式
const getPatternStyle = (index: number) => {
const left = Math.random() * 100;
const top = Math.random() * 100;
const size = 24 + Math.random() * 36;
const duration = 15 + Math.random() * 20;
const delay = Math.random() * 5;
const rotation = Math.random() * 360;
return {
left: `${left}%`,
top: `${top}%`,
fontSize: `${size}px`,
animationDuration: `${duration}s`,
animationDelay: `${delay}s`,
transform: `rotate(${rotation}deg)`
};
};
// 扫描线样式
const getScanStyle = (index: number) => {
const left = Math.random() * 100;
const height = 200 + Math.random() * 400;
const duration = 3 + Math.random() * 5;
const delay = Math.random() * 2;
return {
left: `${left}%`,
height: `${height}px`,
animationDuration: `${duration}s`,
animationDelay: `${delay}s`
};
};
// 数据流样式
const getStreamStyle = (index: number) => {
const left = Math.random() * 100;
const duration = 8 + Math.random() * 12;
const delay = Math.random() * 5;
return {
left: `${left}%`,
animationDuration: `${duration}s`,
animationDelay: `${delay}s`
};
};
// 术语样式
const getTermStyle = (index: number) => {
const left = Math.random() * 100;
const top = Math.random() * 100;
const duration = 10 + Math.random() * 15;
const delay = Math.random() * 4;
const opacity = 0.1 + Math.random() * 0.3;
const fontSize = 20 + Math.random() * 30;
return {
left: `${left}%`,
top: `${top}%`,
animationDuration: `${duration}s`,
animationDelay: `${delay}s`,
opacity: opacity,
fontSize: `${fontSize}px`
};
};
// 事件处理
const onInputFocus = (event: Event) => {
const target = event.target as HTMLElement;
target.parentElement?.classList.add('focused');
};
const onInputBlur = (event: Event) => {
const target = event.target as HTMLElement;
target.parentElement?.classList.remove('focused');
};
const onBtnHover = (event: Event) => {
const btn = event.currentTarget as HTMLElement;
btn.classList.add('hover');
};
const onBtnLeave = (event: Event) => {
const btn = event.currentTarget as HTMLElement;
btn.classList.remove('hover');
};
// 原有的登录逻辑保持不变
const currentTime = computed(() => {
return formatAxis(new Date());
});
/* 检测按钮 */
.login-action {
margin-top: 40px;
}
.detection-btn {
width: 100%;
height: 64px;
padding: 0;
border: none;
border-radius: 16px;
background: linear-gradient(135deg,
rgba(255, 159, 28, 0.9) 0%,
rgba(46, 196, 182, 0.9) 50%,
rgba(231, 29, 54, 0.9) 100%);
position: relative;
overflow: hidden;
transition: all 0.3s ease;
transform-style: preserve-3d;
perspective: 1000px;
}
.btn-content {
position: relative;
z-index: 2;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 32px;
height: 100%;
transform: translateZ(20px);
}
.btn-text {
display: flex;
flex-direction: column;
gap: 4px;
}
.text-main {
color: white;
font-size: 18px;
font-weight: 700;
letter-spacing: 1.5px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.text-sub {
color: rgba(255, 255, 255, 0.8);
font-size: 11px;
font-weight: 500;
letter-spacing: 2px;
text-transform: uppercase;
}
.btn-scan {
display: flex;
align-items: center;
gap: 4px;
}
.scan-dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: white;
animation: scanPulse 1.5s ease-in-out infinite;
}
.scan-dot:nth-child(2) {
animation-delay: 0.2s;
}
.scan-dot:nth-child(3) {
animation-delay: 0.4s;
}
@keyframes scanPulse {
0%, 100% { opacity: 0.3; transform: scale(1); }
50% { opacity: 1; transform: scale(1.5); }
}
后端代码展示

详细功能展示视频
基于深度学习的麻将识别检测系统(DeepSeek智能分析+YOLOv8/YOLOv10/YOLOv11/YOLOv12+最新web界面 +前后端分离)_哔哩哔哩_bilibili
基于深度学习的麻将识别检测系统(DeepSeek智能分析+YOLOv8/YOLOv10/YOLOv11/YOLOv12+最新web界面 +前后端分离)_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1XjkuBDEut/?vd_source=549d0b4e2b8999929a61a037fcce3b0fhttps://www.bilibili.com/video/BV1XjkuBDEut/
项目安装教程
https://www.bilibili.com/video/BV1YLsXzJE2X/?spm_id_from=333.1387.homepage.video_card.click
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)