Python Flask + ECharts 构建实时比赛排名可视化系统
最近在参与一些算法竞赛时发现很多同学对如何实时、准确地追踪比赛排名并将其可视化展示感到头疼。无论是学校内部的编程比赛还是像“抖火杯”这类公开赛事一个清晰、动态的排行榜不仅能提升参赛体验也是组织者展示比赛进程的关键。本文将以一个模拟的“抖火杯S3积分赛”场景为例手把手带你从零构建一个完整的比赛排名追踪与可视化系统。我们将使用 Python 作为后端处理数据搭配简单的 Web 前端进行展示涵盖数据处理、排名计算、Web 服务搭建和前端图表渲染全流程。无论你是想为自己的比赛项目添加排名功能还是学习数据可视化与 Web 开发的结合这篇文章都能提供一套可直接复用的方案。1. 背景与核心概念为什么需要动态排名系统在算法竞赛、电竞比赛或任何积分制活动中排名系统是核心。一个基础的排名系统需要解决几个问题实时性新的提交或比赛结果产生后排名应能尽快更新。准确性排名规则如积分、解题数、罚时必须被正确无误地计算。可视化枯燥的数据表格不利于观察图表化展示如条形竞赛图能直观反映队伍间的竞争态势。可扩展性系统应能方便地添加新的比赛、队伍或修改排名规则。本文模拟的“抖火杯S3积分赛”就是一个典型场景。我们假设比赛有多支队伍通过多轮积分赛决出名次。我们将构建一个系统后端模拟数据更新前端以动态条形图的形式展示排名变化类似“熊出没队”和“奥特兄弟队”争夺前两名的动态过程。2. 环境准备与版本说明本项目主要使用 Python 作为后端搭配 Flask 框架提供 Web API并使用 Apache ECharts 进行前端图表绘制。前端部分仅使用 HTML 和 JavaScript无需复杂框架。推荐环境与版本操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04)。本文示例在 Windows 11 下开发。Python3.8 或更高版本。这是后端逻辑和 Web 服务的基础。核心 Python 库Flask(2.0.0): 轻量级 Web 框架用于创建 API。pandas(1.3.0): 数据处理与分析库方便进行排序和计算。可选Faker: 用于生成模拟的队名和数据。前端技术HTML5JavaScript (ES6)Apache ECharts (5.4.0): 一个强大的、开源的可视化图表库。IDE/编辑器VS Code, PyCharm 或任何你熟悉的文本编辑器。浏览器Chrome, Firefox 或 Edge 等现代浏览器。版本兼容性说明本文示例代码基于上述版本编写重点在于演示核心思路。如果你的环境版本略有不同核心逻辑通常不受影响但安装依赖时请注意命令差异。3. 核心原理与系统设计拆解在开始编码前我们先理清系统的核心组件和数据流。3.1 系统架构我们的系统将采用前后端分离的简单架构后端 (Python/Flask)维护一个队伍数据的列表内存中或连接数据库。提供一个 API 接口如/api/rank当被请求时计算当前排名并返回 JSON 格式数据。可以模拟一个定时任务或另一个 API 来“更新”队伍积分模拟比赛进程。前端 (HTML/JS/ECharts)一个 HTML 页面包含一个用于显示图表的div容器。使用 JavaScript 定时例如每 3 秒调用后端的/api/rank接口。获取到最新的排名数据后调用 ECharts 的 API 更新条形竞赛图。3.2 排名数据模型每个队伍Team至少包含以下属性name: 队伍名称字符串如“熊出没队”、“奥特兄弟队”。score: 当前总积分数值是排名的核心依据。history_score(可选): 历史积分列表用于绘制趋势图。排名规则很简单按score降序排列。如果积分相同可以引入第二排序键如最后一轮得分时间、队伍ID等本例中我们假设积分不会完全相同以简化逻辑。3.3 ECharts 条形竞赛图ECharts 的“条形竞赛图”本质上是动态排序的条形图。它展示每个数据项在特定维度上的数值并随着数据更新条形长度和位置会动态变化形成你追我赶的竞赛效果非常适合展示实时排名。4. 完整实战案例构建排名追踪系统接下来我们分步骤实现整个系统。4.1 创建项目结构首先创建一个项目文件夹例如competition_rank并在其中创建如下文件和文件夹competition_rank/ ├── app.py # Flask 后端主程序 ├── requirements.txt # Python 依赖列表 ├── static/ # 静态资源文件夹 │ └── js/ │ └── main.js # 前端主要 JavaScript 逻辑 └── templates/ # 模板文件夹 (Flask 默认) └── index.html # 前端主页面4.2 后端开发Flask API 与数据模拟步骤1安装依赖在项目根目录下创建requirements.txt文件内容如下Flask2.3.3 pandas2.0.3然后在终端中进入项目目录运行安装命令pip install -r requirements.txt步骤2编写 Flask 后端 (app.py)app.py将负责初始化队伍数据、提供排名 API 和模拟积分更新。# app.py from flask import Flask, jsonify, render_template import random from datetime import datetime import pandas as pd app Flask(__name__) # 初始化队伍数据 # 在实际应用中这些数据可能来自数据库 teams [ {id: 1, name: 熊出没队, score: 150}, {id: 2, name: 奥特兄弟队, score: 145}, {id: 3, name: 先锋编程者, score: 130}, {id: 4, name: 算法猎人, score: 125}, {id: 5, name: 代码永动机, score: 120}, {id: 6, name: 二进制诗人, score: 110}, {id: 7, name: 深夜调试员, score: 105}, {id: 8, name: 无限循环, score: 95}, ] def calculate_rank(): 计算当前排名 # 使用 pandas 进行排序更高效简洁 df pd.DataFrame(teams) df_sorted df.sort_values(byscore, ascendingFalse).reset_index(dropTrue) df_sorted[rank] df_sorted.index 1 # 添加排名列 # 将 DataFrame 转换回字典列表方便 JSON 序列化 ranked_teams df_sorted.to_dict(records) return ranked_teams app.route(/) def index(): 渲染前端主页面 return render_template(index.html) app.route(/api/rank) def get_rank(): 提供排名数据的 API 接口 ranked_teams calculate_rank() # 返回 JSON 数据包含排名列表和当前时间戳 return jsonify({ success: True, data: ranked_teams, timestamp: datetime.now().strftime(%H:%M:%S) }) app.route(/api/update_score, methods[POST]) def update_score(): 模拟更新分数仅供演示实际应由比赛结果触发 global teams for team in teams: # 为每支队伍随机增加一个小的分数模拟比赛进程 increment random.randint(0, 5) team[score] increment # 重新计算排名 ranked_teams calculate_rank() return jsonify({ success: True, message: 分数已更新, data: ranked_teams }) if __name__ __main__: # debugTrue 仅用于开发环境生产环境必须关闭 app.run(debugTrue, port5000)代码解释我们定义了一个全局的teams列表来存储队伍信息。calculate_rank函数使用pandas库对队伍按积分排序并添加排名序号。/api/rank接口是前端获取数据的关键它返回包含排名、队伍名和积分的 JSON。/api/update_score接口用于手动触发分数更新模拟比赛进行。在实际项目中这个操作应该由判题系统或管理员后台调用。app.run(debugTrue)会在本地启动一个开发服务器访问http://127.0.0.1:5000即可。4.3 前端开发动态排名可视化步骤1编写主页面 (templates/index.html)这个页面负责加载 ECharts 库并定义图表容器。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title抖火杯S3积分赛 - 实时排名/title !-- 引入 ECharts -- script srchttps://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js/script style body { font-family: Segoe UI, Tahoma, Geneva, Verdana, sans-serif; margin: 20px; background-color: #f5f7fa; } .header { text-align: center; margin-bottom: 30px; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .container { display: flex; flex-direction: column; align-items: center; max-width: 1200px; margin: 0 auto; } #rankChart { width: 100%; height: 600px; background-color: white; border-radius: 10px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); padding: 20px; box-sizing: border-box; } .controls { margin: 20px 0; } button { padding: 10px 20px; margin: 0 10px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; transition: background-color 0.3s; } button:hover { background-color: #45a049; } #updateBtn { background-color: #008CBA; } #updateBtn:hover { background-color: #007B9A; } .timestamp { margin-top: 15px; color: #666; font-size: 0.9em; } /style /head body div classcontainer div classheader h1 抖火杯S3积分赛 - 实时排名追踪/h1 p数据每 3 秒自动更新 | 最后更新: span idlastUpdateTime--:--:--/span/p /div div classcontrols button idupdateBtn onclickmanualUpdate()手动模拟下一轮比赛/button button onclickresetData()重置为初始数据/button /div !-- 图表容器 -- div idrankChart/div div classtimestamp iddataSourceTip 数据来源后端模拟API | 图表类型动态条形图 (ECharts) /div /div !-- 引入我们自己的JS文件 -- script src{{ url_for(static, filenamejs/main.js) }}/script /body /html步骤2编写前端逻辑 (static/js/main.js)这是实现动态获取数据并更新图表的 JavaScript 核心代码。// static/js/main.js let myChart null; let currentData []; // 初始化 ECharts 实例 function initChart() { const chartDom document.getElementById(rankChart); myChart echarts.init(chartDom); // 初始设置一个空的配置 const option { title: { text: 队伍积分排名, left: center }, tooltip: { trigger: axis, axisPointer: { type: shadow }, formatter: function (params) { // 自定义提示框内容 let tip 排名${params[0].dataIndex 1}br/; tip 队伍${params[0].name}br/; tip 积分b${params[0].value}/b; return tip; } }, grid: { left: 3%, right: 4%, bottom: 3%, containLabel: true }, xAxis: { type: value, name: 积分, axisLabel: { formatter: {value} 分 } }, yAxis: { type: category, data: [], // 初始为空将从API获取 inverse: true, // 让排名第一的显示在最上面 axisLabel: { fontSize: 14, rich: { first: { color: #FFD700, fontWeight: bold }, second: { color: #C0C0C0, fontWeight: bold }, third: { color: #CD7F32, fontWeight: bold } }, // 为前三名添加特殊样式 formatter: function (value, index) { let rank index 1; if (rank 1) { return {first| ${value}}; } else if (rank 2) { return {second| ${value}}; } else if (rank 3) { return {third| ${value}}; } else { return ${rank}. ${value}; } } }, animationDuration: 300, animationDurationUpdate: 300 }, series: [ { name: 积分, type: bar, data: [], // 初始为空 label: { show: true, position: right, formatter: {c} 分 }, itemStyle: { // 根据排名设置渐变色 color: function (params) { const rank params.dataIndex 1; const colorList [ linear-gradient(90deg, #FFD700, #FFEC8B), // 金牌 linear-gradient(90deg, #C0C0C0, #E0E0E0), // 银牌 linear-gradient(90deg, #CD7F32, #E6B87D), // 铜牌 linear-gradient(90deg, #5470c6, #91cc75), // 其他 ]; return rank 3 ? colorList[rank - 1] : colorList[3]; }, borderRadius: [0, 5, 5, 0] }, emphasis: { focus: series }, animationDuration: 1000, animationDurationUpdate: 1000, animationEasing: cubicInOut, } ] }; myChart.setOption(option); // 窗口大小改变时重绘图表 window.addEventListener(resize, function() { myChart.resize(); }); } // 从后端API获取排名数据 function fetchRankData() { fetch(/api/rank) .then(response response.json()) .then(result { if (result.success) { currentData result.data; updateChart(currentData); // 更新页面上的时间戳 document.getElementById(lastUpdateTime).textContent result.timestamp; } else { console.error(获取数据失败:, result.message); } }) .catch(error { console.error(请求出错:, error); document.getElementById(lastUpdateTime).textContent 获取失败; }); } // 用新数据更新图表 function updateChart(rankedTeams) { if (!myChart) return; // 准备图表需要的数据 const teamNames rankedTeams.map(team team.name); const teamScores rankedTeams.map(team team.score); const option { yAxis: { data: teamNames }, series: [{ data: teamScores }] }; // 使用 setOption 更新数据notMerge: false 表示合并选项只更新变化的部分 myChart.setOption(option); } // 手动触发模拟更新调用后端更新接口 function manualUpdate() { fetch(/api/update_score, { method: POST }) .then(response response.json()) .then(result { if (result.success) { alert(已模拟一轮比赛分数已更新); // 更新后立即获取最新排名 fetchRankData(); } }) .catch(error { console.error(更新分数失败:, error); alert(更新失败请检查控制台。); }); } // 重置数据到初始状态前端模拟实际项目需后端接口 function resetData() { if (confirm(确定要重置所有队伍积分到初始状态吗)) { // 在实际项目中这里应该调用一个后端重置接口 // 本例中我们直接重新加载页面Flask会重新初始化数据 window.location.reload(); } } // 页面加载完成后初始化 document.addEventListener(DOMContentLoaded, function() { initChart(); fetchRankData(); // 首次加载数据 // 设置定时器每3秒自动获取一次数据 setInterval(fetchRankData, 3000); });4.4 运行与验证启动后端服务在项目根目录下打开终端运行python app.py如果看到类似* Running on http://127.0.0.1:5000的输出说明服务启动成功。访问前端页面打开浏览器访问http://127.0.0.1:5000。查看效果你应该能看到一个美观的排名条形图。“熊出没队”和“奥特兄弟队”位列前二。图表每3秒会自动从后端获取数据并更新。交互测试点击“手动模拟下一轮比赛”按钮后端会为所有队伍随机增加积分图表会动态更新你可以看到排名可能发生变化。点击“重置为初始数据”按钮页面会刷新数据回到初始状态。4.5 结果说明运行成功后你将拥有一个完整的、本地运行的比赛排名可视化系统。前端页面会动态展示积分条形图并高亮显示前三名。后端 Flask 程序提供了数据接口和模拟更新的功能。这个系统已经具备了核心的实时排名展示能力。5. 常见问题与排查思路在实现和运行上述系统时你可能会遇到以下问题问题现象可能原因解决思路访问http://127.0.0.1:5000报错Not Found或空白页1. Flask 服务未启动。2.index.html文件未放在templates文件夹内。3. 路由app.route(/)定义错误。1. 检查终端是否成功运行python app.py且无报错。2. 确认index.html文件路径为项目根目录/templates/index.html。3. 检查app.py中是否有def index():函数并正确返回render_template(index.html)。浏览器控制台报错Failed to fetch或404(针对/api/rank)1. 后端 API 路由未正确定义。2. 前端 JS 中请求的 URL 错误。3. Flask 服务运行在别的端口。1. 检查app.py中是否有app.route(/api/rank)装饰的函数。2. 检查main.js中fetch(/api/rank)的路径是否正确。3. 确认 Flask 启动的端口默认5000与访问的端口一致。图表不显示或显示异常1. ECharts 库未成功加载。2.initChart()函数在 DOM 未加载完成时被调用。3.myChart变量未正确初始化。1. 检查浏览器网络面板确认echarts.min.js是否加载成功。2. 确保 JS 代码在DOMContentLoaded事件中初始化图表。3. 打开浏览器开发者工具控制台查看是否有 JS 错误。数据不更新1. 前端定时器setInterval未生效。2. 后端数据没有变化模拟更新未触发。3. 前端fetchRankData函数有错误。1. 检查setInterval(fetchRankData, 3000)是否被执行。2. 点击“手动模拟”按钮看后端控制台是否有日志前端是否收到新数据。3. 在fetchRankData函数中添加console.log或使用断点调试。排名计算错误同分未处理排序逻辑未考虑同分情况。修改calculate_rank函数在 Pandas 排序时添加第二排序键例如df.sort_values(by[score, last_submit_time], ascending[False, True])。6. 最佳实践与工程建议将演示系统转化为一个健壮的生产级项目还需要考虑以下几点数据持久化现状当前数据存储在内存变量teams中服务重启后数据会丢失。改进集成数据库如 SQLite轻量、PostgreSQL 或 MySQL。使用 SQLAlchemy 等 ORM 库来管理队伍Team、比赛Contest、提交Submission等实体。后端架构优化API 设计遵循 RESTful 规范设计清晰的资源端点如GET /api/contests/id/teams。异步更新对于频繁的数据更新如实时判题反馈考虑使用 WebSocket如 Flask-SocketIO替代 HTTP 轮询实现真正的实时推送减轻服务器压力。缓存排名计算如果耗时可以引入 Redis 缓存计算结果设置合理的过期时间。前端体验增强平滑动画ECharts 本身动画不错可以调整animationDurationUpdate等参数使排名变化更平滑。更多视图除了总积分榜可以增加“本轮积分变化”、“排名变化趋势图折线图”、“队伍详情页”等。响应式设计确保图表在不同屏幕尺寸手机、平板上都能良好显示。安全与性能输入验证所有后端 API 接口特别是接收数据的POST/PUT接口必须对传入参数进行严格的验证和清理防止 SQL 注入或非法数据。错误处理后端应提供统一的错误响应格式前端应有相应的错误提示如 Toast 消息。生产部署不要使用debugTrue部署生产服务。应使用 Gunicorn、uWSGI 等 WSGI 服务器并配合 Nginx 进行反向代理。可扩展性设计插件化排名规则将排名计算逻辑抽象成独立的函数或类方便未来支持多种赛制如 ACM 赛制、OI 赛制。配置化管理将比赛名称、积分规则、时间等参数抽取到配置文件或数据库表中。7. 总结本文通过构建“抖火杯S3积分赛”排名系统完整演示了如何利用 Python Flask 和 ECharts 实现一个动态数据可视化项目。我们从系统设计、环境搭建、前后端编码到最终运行和问题排查走完了全流程。关键掌握点Flask 基础如何创建 Web 应用、定义路由、返回 JSON 数据。前后端交互前端如何使用fetchAPI 调用后端接口并处理返回的 JSON 数据。ECharts 应用如何配置动态条形图并通过setOption方法更新数据。数据处理使用 Pandas 进行便捷的数据排序和操作。下一步可以尝试将内存数据存储替换为真实的数据库。实现一个管理后台用于手动添加队伍、修改积分。为图表添加更复杂的交互如点击队伍名查看详情。尝试使用 WebSocket 实现排名实时推送取代当前的定时轮询。这个项目麻雀虽小五脏俱全涵盖了 Web 开发中数据流、API 设计和可视化等多个核心环节。你可以基于此框架将其改造成任何需要动态排名展示的场景如直播投票、销售业绩榜、游戏排行榜等。动手实践是学习的最佳途径不妨克隆代码添加你自己的功能吧。如果在实现过程中遇到问题欢迎在评论区交流讨论。

相关新闻

摄影器材海外红人营销:从头部KOL到微型红人矩阵的转型

摄影器材海外红人营销:从头部KOL到微型红人矩阵的转型

1. 项目概述:摄影器材海外红人营销的范式转移三年前当我第一次帮国产三脚架品牌对接YouTube测评博主时,头部KOL的单条视频报价足够买下他们半年的谷歌广告预算。而今天同一个品牌方告诉我,他们最新爆款稳定器的推广策略,是同时启动…

2026/10/18 7:20:55 阅读更多 →
OLAP安全审计:核心挑战与解决方案

OLAP安全审计:核心挑战与解决方案

1. OLAP安全审计的核心挑战与行业背景在金融、电信、政务等强监管领域,OLAP系统每天处理着PB级敏感数据。去年某银行因分析平台权限漏洞导致百万级客户信息泄露的事件,让行业意识到传统数据库审计方案在OLAP场景下的严重不足。与OLTP系统不同&#xff0c…

2026/10/18 2:15:35 阅读更多 →
微信聊天记录永久保存指南:3步导出加密表情包和完整历史

微信聊天记录永久保存指南:3步导出加密表情包和完整历史

微信聊天记录永久保存指南:3步导出加密表情包和完整历史 【免费下载链接】wechat-dump Analyzing your wechat message history from android 项目地址: https://gitcode.com/gh_mirrors/we/wechat-dump 你是否曾为微信聊天记录的丢失而烦恼?那些…

2026/10/2 19:29:04 阅读更多 →

最新新闻

国产Linux系统访问Windows共享文件:SMB挂载与排错实战

国产Linux系统访问Windows共享文件:SMB挂载与排错实战

1. 为什么“获取共享文件”绕不开SMB这条路“国产操作系统下获取Windows共享文件”这个需求,听着简单,实际做起来处处是坑。大多数场景是某单位的文档服务器、某项目部的文件备份机、或者办公室那台常年开着的Windows老机器,上面挂着几个共享…

2026/10/18 7:21:02 阅读更多 →
书匠策AI科研绘图实测:机制图、流程图与数据可视化一键生成

书匠策AI科研绘图实测:机制图、流程图与数据可视化一键生成

科研绘图有多重要,做学术的人都心知肚明。论文里的机制图、教学模式图、实验流程图,还有各类数据示意图,评审人第一眼看的不是你写了多少字,而是图清不清楚、逻辑自不自然。这些年我见过太多研究内容本身很好,结果被示…

2026/10/18 7:21:02 阅读更多 →
AI科研绘图实战:从实验数据到投稿级论文配图的全流程指南

AI科研绘图实战:从实验数据到投稿级论文配图的全流程指南

做了这几年论文辅导和科研支持工作,我越来越确定一件事:一张图的分量,远比很多人想象的要重。同样的实验数据,配Excel默认样式的柱状图,和配上一张经过专业打磨、符合期刊投稿规范的结果图,审稿人给出的第一…

2026/10/18 7:21:02 阅读更多 →
中老年社交场景下的API接口设计:弱网、低端机与缓存策略实战

中老年社交场景下的API接口设计:弱网、低端机与缓存策略实战

上个月我们线上系统跑出一个告警,某个接口的P99耗时从前一天的320毫秒突然飙到1.8秒,值班同事第一反应是数据库慢查询,结果查下来发现是某中老年用户群体常用的社交功能列表页,在晚间活跃高峰把后端打穿了。这个排查过程让我重新审…

2026/10/18 7:21:02 阅读更多 →
技术没那么重要?程序员真正拉开差距的是业务理解与协作

技术没那么重要?程序员真正拉开差距的是业务理解与协作

做技术越久,越发现技术本身没那么重要干了十几年开发,从最初的C、Java一路折腾到云计算和AI应用,这几年最深的体会不是哪个框架又多牛了,也不是又优化了多少毫秒的响应时间,反而是一个听起来有点“丧”的结论&#xff…

2026/10/18 7:21:02 阅读更多 →
从零搭建苏菜健康分享网站:Vue + Django全栈开发实战

从零搭建苏菜健康分享网站:Vue + Django全栈开发实战

我一直觉得,学Web开发最怕的就是“学了一堆技术但拼不出一个完整的东西”。Django会一点,Vue也看过教程,真要独立从零搭一个能跑通前后端的网站,很多人心里还是犯嘀咕的。所以这次我想拿一个非常典型的案例——苏菜与健康分享网站…

2026/10/18 7:20:02 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →