MATLAB ECG仿真GUI实战:信号生成、滤波与心律失常分析

简介:ECGGUI_ECGMATLAB_matlabGUI_ECGarrhythmia_ 是一套面向生物医学工程、信号处理方向学生与科研人员的 MATLAB 心电图分析工具,重点解决 ECG 数据预处理、波形识别与心律失常检测问题。项目以 GUI 交互方式降低使用门槛,适合具备一定 MATLAB 基础、希望快速上手心电信号分析的读者。压缩包共 14 个文件,约 80KB,包含 6 个 m 脚本、2 个 hea 头文件、2 个 info 说明文件、2 个 mat 数据文件及 1 个 fig 界面文件,分别承担算法实现、数据描述、信号存储与界面布局等职责。已有 175 人学习下载。资源覆盖数据导入、噪声滤除与基线校正、RR 间期与心率计算、P/QRS/T 波识别、QT 与 PR 间期分析、心律失常判定及结果可视化等环节,并附带分形维数计算脚本,可帮助读者理解从原始信号到异常事件标记的完整流程,适合作为课程设计、毕业设计或算法验证的参考模板。

1. 拆开一个 ECG 仿真 GUI 资源包:它到底能跑出什么

如果你手头正好有一个叫ECGGUI_ECGMATLAB_matlabGUI_ECGarrhythmia_的压缩包,点进去大概率是一堆.m文件、几个.fig界面文件,外加一两个示例数据。别急着双击运行,先搞清楚它是什么:这是一套基于 MATLAB 的 ECG 心电信号仿真与心律失常分析 GUI 工具集,核心是把心电信号的生成、滤波、QRS 检测、心率变异性分析和几种常见心律失常的模拟,全部塞进一个可视化界面里。它解决的不是临床诊断问题,而是教学演示、算法验证和课程设计里“我想快速看到一段带噪声的 ECG 经过处理后长什么样”的需求。适合谁?做生物医学信号处理课程设计的学生、需要快速搭一个 ECG 算法验证平台的工程师,以及想拿现成 GUI 改造成自己实验界面的开发者。你不需要从零写滤波器,也不用自己画界面,但前提是 MATLAB 版本别太老,并且你得知道每个按钮背后到底调了什么函数。

2. 环境准备与文件结构:先让 GUI 跑起来再说

2.1 MATLAB 版本与工具箱依赖

这个资源包对 MATLAB 版本有一定要求。常见做法是 R2016b 及以上,因为里面用到了app designer之前的传统 GUI 编程方式,也就是guide生成的.fig加.m回调。如果你用的是 R2020a 之后的版本,guide仍然能打开,但部分控件属性名可能有细微变化,比如String和Value的兼容性一般没问题,但Position单位在跨分辨率屏幕上会偏移。真正需要确认的是工具箱:信号处理工具箱(Signal Processing Toolbox)必须有,因为butter、filtfilt、findpeaks这些函数都依赖它。如果没有,GUI 里滤波和 QRS 检测按钮会直接报错。

检查方法很简单,在命令行输入:

ver('signal')

如果输出里包含 Signal Processing Toolbox 和版本号,说明基础环境没问题。另外,如果资源包里出现了wfdb相关文件,那还需要 WFDB 工具箱,但大多数教学版 ECGMATLAB 包不会带这个,通常用load直接读.mat数据。

2.2 目录结构与启动入口

解压后典型结构是这样的:

ECGGUI_ECGMATLAB_matlabGUI_ECGarrhythmia/ ├── main_gui.fig ├── main_gui.m ├── ecg_generate.m ├── ecg_filter.m ├── qrs_detect.m ├── arrhythmia_sim.m ├── data/ │ ├── normal_ecg.mat │ └── afib_ecg.mat └── utils/ └── plot_helper.m

启动入口是main_gui.m,但不要直接右键运行。正确做法是在 MATLAB 当前文件夹切换到该目录,然后在命令行输入:

main_gui

这样.fig和.m的关联才不会断。如果你双击.fig打开,MATLAB 只会打开界面编辑器,不会执行回调初始化,按钮点下去没反应是常见翻车现场。

2.3 首次运行的数据加载与界面初始化

GUI 启动后一般会自动加载data/下的示例数据。如果界面空白,检查main_gui.m里的OpeningFcn是否有一行类似:

handles.ecg_data = load('data/normal_ecg.mat'); guidata(hObject, handles);

如果没有,手动在OpeningFcn末尾补上。guidata是传统 GUI 里传递数据的核心,所有回调里想用handles.ecg_data都必须先guidata(hObject, handles)更新。很多新手改完代码发现数据不更新,九成是漏了这句。

提示:如果启动时报Undefined function 'ecg_generate',说明当前路径没包含子文件夹,用addpath(genpath(pwd))把整个目录树加进来。

3. ECG 信号生成与滤波:参数怎么设才不飘

3.1 合成 ECG 的数学模型与采样率选择

资源包里的ecg_generate.m通常用类似 McSharry 的合成模型,或者更简单的三角波叠加高斯函数来模拟 P、QRS、T 波。核心参数有三个:采样率fs、心率hr、噪声强度noise_level。常见默认值是fs = 360 Hz,这是 MIT-BIH 数据库的标准采样率,方便后续和真实数据对比。心率默认 60 到 100 之间随机,噪声用高斯白噪声加基线漂移。

看一段典型代码:

function [ecg, t] = ecg_generate(fs, hr, duration, noise_level) % fs: 采样率 Hz % hr: 心率 bpm % duration: 信号时长 秒 % noise_level: 噪声标准差 t = 0:1/fs:duration; period = 60/hr; ecg = zeros(size(t)); for beat = 0:floor(duration/period)-1 center = beat * period + 0.2; % QRS 主波,用高斯函数模拟 ecg = ecg + 1.2 * exp(-((t - center)/0.015).^2); % T 波 ecg = ecg + 0.3 * exp(-((t - center - 0.25)/0.04).^2); % P 波 ecg = ecg + 0.15 * exp(-((t - center + 0.15)/0.03).^2); end ecg = ecg + noise_level * randn(size(t)); ecg = ecg + 0.1 * sin(2*pi*0.3*t); % 基线漂移 end

逻辑说明:每个心拍由三个高斯脉冲组成,分别对应 P、QRS、T 波,中心位置按 RR 间期排列。参数0.015、0.04、0.03控制波宽,改小会让波形更尖,改大更圆钝。noise_level一般设 0.05 到 0.2,超过 0.3 后 QRS 检测就会开始漏检。基线漂移用 0.3 Hz 正弦模拟呼吸影响,幅度 0.1 是常见值。

3.2 带通滤波器的设计与 filtfilt 零相位滤波

GUI 里“滤波”按钮通常调用ecg_filter.m,里面是一个 0.5 到 40 Hz 的巴特沃斯带通。为什么是 0.5 到 40?因为 ECG 主要能量在 0.5 到 40 Hz,低于 0.5 是基线漂移,高于 40 是工频和肌电噪声。设计代码如下:

function ecg_filtered = ecg_filter(ecg, fs) % 0.5-40 Hz 带通,3阶巴特沃斯 low_cut = 0.5; high_cut = 40; wn = [low_cut, high_cut] / (fs/2); [b, a] = butter(3, wn, 'bandpass'); ecg_filtered = filtfilt(b, a, ecg); end

参数说明:butter(3, ...)里的 3 是阶数,阶数越高过渡带越陡,但相位非线性越严重。这里用filtfilt而不是filter,因为filtfilt做正向和反向两次滤波,抵消相位失真,保证 QRS 波位置不偏移。如果你改成filter,会发现滤波后 R 峰位置整体右移,后续心率计算全错。这是血泪经验,别问怎么知道的。

注意:filtfilt要求信号长度至少是滤波器阶数的 3 倍,短信号会报错。如果只生成 2 秒数据,fs=360有 720 点,够用;但如果你把duration改成 0.5 秒,就会翻车。

3.3 工频干扰去除与陷波器参数

有些版本会加一个 50 Hz 陷波,因为国内工频是 50 Hz。代码类似:

wo = 50 / (fs/2); bw = wo / 35; [b, a] = iirnotch(wo, bw); ecg = filtfilt(b, a, ecg);

bw是带宽,wo/bw是品质因数,35 对应 Q 值约 35,带宽窄,只衰减 50 Hz 附近。如果设成 10,带宽变宽,会把 40 到 60 Hz 的有用成分也吃掉。常见做法是 Q 值取 30 到 40 之间。

4. QRS 检测与心律失常模拟:从找 R 峰到造出房颤

4.1 基于差分阈值的 QRS 检测实现

qrs_detect.m一般不会用太复杂的 Pan-Tompkins,而是简化版:带通滤波后求差分、平方、移动平均,再阈值判断。看代码:

function [r_peaks, hr] = qrs_detect(ecg, fs) % 简化 QRS 检测 diff_ecg = diff(ecg); squared = diff_ecg .^ 2; window = round(0.1 * fs); % 100ms 移动平均 ma = movmean(squared, window); threshold = 0.3 * max(ma); min_dist = round(0.25 * fs); % 最小 RR 间期 250ms [pks, locs] = findpeaks(ma, 'MinPeakHeight', threshold, ... 'MinPeakDistance', min_dist); % 在原始信号上定位 R 峰 r_peaks = zeros(size(pks)); for i = 1:length(pks) [~, idx] = max(ecg(max(1,locs(i)-round(0.05*fs)) : ... min(length(ecg), locs(i)+round(0.05*fs)))); r_peaks(i) = max(1,locs(i)-round(0.05*fs)) + idx - 1; end rr = diff(r_peaks) / fs; hr = 60 ./ mean(rr); end

逻辑说明:先差分增强 QRS 斜率,平方后全部变正,移动平均平滑。threshold取最大值的 0.3 倍是经验值,噪声大时调到 0.4,信号弱时降到 0.2。min_dist防止 T 波被误判成 R 波,因为 T 波和 R 波间隔通常大于 250 ms。最后在原始信号局部窗口内找最大值,把位置修正回 R 峰顶点。

参数怎么调:如果发现漏检,先看ma的波形,阈值太高就降;如果发现多检,看min_dist是不是太小,或者 T 波太高。房颤信号 RR 间期绝对不规则,min_dist要适当减小到 0.2 秒,否则会漏掉快心室率。

4.2 心律失常模拟:房颤、室早、心动过速的生成逻辑

arrhythmia_sim.m通常提供三种模式:正常窦性、房颤、室性早搏。房颤的模拟方式是随机化 RR 间期,同时去掉 P 波:

function ecg = simulate_afib(fs, duration) t = 0:1/fs:duration; ecg = zeros(size(t)); current_time = 0; while current_time < duration rr = 0.3 + 0.4 * rand(); % RR 间期 0.3-0.7 秒随机 center = current_time + 0.1; ecg = ecg + 1.2 * exp(-((t - center)/0.015).^2); ecg = ecg + 0.3 * exp(-((t - center - 0.2)/0.04).^2); % 没有 P 波 current_time = current_time + rr; end ecg = ecg + 0.05 * randn(size(t)); end

室早的模拟是在正常节律中插入一个提前出现的宽大 QRS,后面跟一个代偿间歇。心动过速就是把心率参数直接拉到 150 以上,但注意min_dist要同步改,否则检测不到。

4.3 GUI 回调与数据传递的常见写法

传统 GUI 里,按钮回调通过handles结构传递数据。典型模式:

function pushbutton_filter_Callback(hObject, eventdata, handles) fs = handles.fs; ecg = handles.ecg_data; ecg_filtered = ecg_filter(ecg, fs); handles.ecg_filtered = ecg_filtered; guidata(hObject, handles); axes(handles.axes1); plot(handles.t, ecg_filtered); xlabel('时间 (s)'); ylabel('幅值'); end

关键点:每次修改handles后必须guidata(hObject, handles),否则下一个回调拿到的还是旧数据。axes(handles.axes1)指定绘图区域,不要用figure新开窗口,否则 GUI 布局会乱。

5. 避坑与排查:那些让 GUI 卡死或结果离谱的细节

5.1 现象:点击滤波按钮后界面卡死无响应

原因:filtfilt对超长信号处理慢,或者movmean窗口设得过大。如果生成 10 分钟数据,fs=360就是 21.6 万点,filtfilt三阶滤波虽然快,但如果在循环里反复调用,就会卡。更常见的是while循环里没有更新current_time,死循环。

解决:限制生成长度在 30 秒以内用于演示;检查arrhythmia_sim里的while循环是否有递增语句;用tic/toc测一下每个回调耗时,超过 2 秒就优化。

5.2 现象:QRS 检测结果里 R 峰位置整体偏移

原因:用了filter而不是filtfilt,相位延迟导致 R 峰右移。或者差分后没有做移动平均,阈值判断在噪声上触发。

解决:统一用filtfilt;检查qrs_detect里是否在原始ecg上做局部最大值搜索,而不是在ma上直接取locs。

5.3 现象:房颤模拟出来的信号 RR 间期仍然规则

原因:rand()每次循环返回相同值,因为没初始化随机种子,或者rr计算后被覆盖。MATLAB 旧版本rand默认种子相同,每次启动结果一样。

解决:在脚本开头加rng('shuffle');检查rr变量是否在循环内被重新赋值。

5.4 现象:GUI 界面控件错位或字体模糊

原因:.fig文件在高分辨率屏幕上用normalized单位时,MATLAB 缩放导致像素偏移。或者用了固定Position像素值。

解决:在OpeningFcn里加set(gcf, 'Units', 'normalized', 'Position', [0.1 0.1 0.8 0.8]);控件单位尽量用normalized,避免绝对像素。

5.5 现象:加载.mat数据时报Unable to read file

原因:文件路径用了相对路径,但当前工作目录不是资源包根目录。或者.mat文件是 v7.3 格式,旧版 MATLAB 的load不支持。

解决:用fullfile(pwd, 'data', 'normal_ecg.mat')构造绝对路径;如果是 v7.3,用h5read或者升级 MATLAB。

6. 进阶:把 GUI 拆成可复用函数并做批量验证

6.1 从 GUI 回调中抽离核心算法

GUI 用久了会发现,所有逻辑都绑在按钮上,想批量跑 100 组数据测试算法根本没法弄。我一般会把ecg_generate、ecg_filter、qrs_detect三个函数单独拿出来,写一个脚本批量跑:

fs = 360; hrs = 50:10:120; noise_levels = [0.05, 0.1, 0.2]; results = []; for hr = hrs for nl = noise_levels [ecg, t] = ecg_generate(fs, hr, 30, nl); ecg_f = ecg_filter(ecg, fs); [r_peaks, hr_est] = qrs_detect(ecg_f, fs); error = abs(hr_est - hr); results = [results; hr, nl, hr_est, error]; end end

这样跑完得到一个表格,能看出噪声水平对心率估计误差的影响。常见结果是噪声 0.05 时误差小于 2 bpm,0.2 时误差可能到 10 bpm 以上。

6.2 用表格对比不同参数下的检测性能

噪声水平真实心率估计心率绝对误差
0.056059.80.2
0.106061.21.2
0.206068.58.5
0.0510099.50.5
0.20100112.312.3

这张表说明:噪声到 0.2 时,心率估计已经不可靠,需要先做更强的滤波或者改用 Pan-Tompkins 的阈值自适应策略。

6.3 把 GUI 导出为独立函数供其他脚本调用

如果不想每次开界面,可以把main_gui.m里的核心逻辑封装成ecg_process.m:

function [ecg_raw, ecg_filtered, r_peaks, hr] = ecg_process(fs, hr, duration, noise_level) [ecg_raw, ~] = ecg_generate(fs, hr, duration, noise_level); ecg_filtered = ecg_filter(ecg_raw, fs); [r_peaks, hr] = qrs_detect(ecg_filtered, fs); end

这样在命令行直接[raw, f, r, hr] = ecg_process(360, 75, 30, 0.1);就能拿到全部结果,方便写自动化测试。从那以后我每次拿到这类 GUI 资源,都先花十分钟把核心函数抽出来跑一遍批量测试,确认算法边界在哪,再决定要不要在界面上花时间。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

STM32驱动ADS1262:高精度24位ADC配置与调试指南

STM32驱动ADS1262:高精度24位ADC配置与调试指南

简介&#xff1a;面向STM32开发者的一套ADS1262/ADS126X系列高精度ADC集成配置程序&#xff0c;适合工业数据采集、医疗仪器等对低噪声24位采样有严格要求的嵌入式场景。压缩包共含2个文件——1个C源文件和1个头文件&#xff0c;整体大小仅7KB&#xff0c;代码精简&#xff0c;…

2026/10/20 21:57:46 阅读更多 →
Delphi 6 纯代码条形码控件:Code39/Code128 编码与绘制实战

Delphi 6 纯代码条形码控件:Code39/Code128 编码与绘制实战

简介&#xff1a;这份资源面向仍在使用 Delphi 6 的开发者&#xff0c;提供一套无需任何外部插件即可生成一维条形码的控件源码&#xff0c;适用于库存管理、产品标识、标签打印等需要条码输出的场景。包内共 17 个文件&#xff0c;约 239KB&#xff0c;以 pas 源码、dcu 编译单…

2026/10/20 21:56:41 阅读更多 →
2026年AI工具选型复盘:从200+中筛出12个高效工作流利器

2026年AI工具选型复盘:从200+中筛出12个高效工作流利器

2026年&#xff0c;AI工具选型这件事已经变成了一场比拼“筛选力”的耐力赛。过去一年里&#xff0c;我给自己定了个硬目标&#xff1a;把市面上能试的AI工具尽可能试一遍&#xff0c;再围绕真实工作流做减法。前后加起来&#xff0c;我碰过的工具超过200款&#xff0c;有些五分…

2026/10/20 21:56:41 阅读更多 →

最新新闻

存储接口、总线与协议三者关系详解:从物理连接到数据传输逻辑

存储接口、总线与协议三者关系详解:从物理连接到数据传输逻辑

1. 这不是“背概念”&#xff0c;而是搞懂数据怎么从硬盘跑到你手机屏幕上的你有没有想过&#xff0c;当你在手机上点开一张照片&#xff0c;或者在电脑里双击一个视频文件&#xff0c;背后到底发生了什么&#xff1f;那张照片不是凭空出现的——它得先从硬盘&#xff08;或SSD…

2026/10/20 22:43:03 阅读更多 →
VB6 SQL Server销售管理系统源码解析与实战避坑指南

VB6 SQL Server销售管理系统源码解析与实战避坑指南

简介&#xff1a;这是一套面向VB6初学者与数据库入门者的销售管理系统完整源码&#xff0c;采用VB6.0结合SQLServer2000开发&#xff0c;适合想通过真实项目理解VB与SQLServer交互操作的学习者参考。压缩包共51个文件&#xff0c;约1.37MB&#xff0c;以frm窗体、frx资源文件、…

2026/10/20 22:43:03 阅读更多 →
Flutter多层级图片预览:InteractiveViewer+ColorFilter高性能实践

Flutter多层级图片预览:InteractiveViewer+ColorFilter高性能实践

1. 项目概述&#xff1a;为什么在Flutter里用InteractiveViewer处理多层级图片不是“炫技”&#xff0c;而是刚需&#xff1f;最近帮某高校实验室重构一个医学影像预览模块&#xff0c;核心需求很朴素&#xff1a;医生要在平板上快速查看CT切片序列——每张图本身是高分辨率DIC…

2026/10/20 22:43:03 阅读更多 →
GDI实时抗锯齿实战:从像素填充到AlphaBlend边缘混合

GDI实时抗锯齿实战:从像素填充到AlphaBlend边缘混合

简介&#xff1a;这份资源面向使用 Windows GDI 进行图形绘制的 VC 开发者&#xff0c;针对 LineTo、Ellipse 等函数在曲线与斜线处产生的明显锯齿问题&#xff0c;提供了一套可实时运行的抗锯齿源代码方案。其核心思路是通过边缘检测识别边界像素&#xff0c;再对邻近像素颜色…

2026/10/20 22:43:03 阅读更多 →
鸿蒙PDF开发实战:从文本提取到批注渲染的完整方案

鸿蒙PDF开发实战:从文本提取到批注渲染的完整方案

1. PDF能力全景&#xff1a;先看清鸿蒙给了我们什么做鸿蒙端的PDF功能&#xff0c;一开始我是拒绝的。我看了不少技术社区的帖子&#xff0c;发现很多开发者在拿到PDF相关的需求时&#xff0c;第一反应就是“能不能用WebView套一个浏览器插件”&#xff0c;结果要么交互体验割裂…

2026/10/20 22:43:03 阅读更多 →
Qt5与hidapi实战:手搓USB HID调试助手,告别串口工具

Qt5与hidapi实战:手搓USB HID调试助手,告别串口工具

简介&#xff1a;这是一份面向嵌入式与桌面开发者的USB调试工具源码包&#xff0c;基于Qt5框架与hidapi库实现&#xff0c;可在Windows 10环境下借助mingw编译运行&#xff0c;帮助开发者快速测试和调试支持HID协议的USB设备。资源共19个文件&#xff0c;约1004KB&#xff0c;包…

2026/10/20 22:41:59 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →