
loclove/electronics-design-competition-skill
API development灵眸:电赛-视觉skill
概要
灵眸是一个面向全国大学生电子设计竞赛视觉任务的 Codex Skill,目标是把“赛题理解、硬件适配、视觉识别、高帧率优化、串口控制、现场调参”串成一条可落地的工程链路。 它既支持从零写一套清晰的 OpenCV/cv_lite 框架,也支持在官方固件例程、YYB 仓库代码、用户已有脚本上继续叠加优化。默认原则是:先按赛题分层,最终输出多通道方案,识别通道可按任务降低分辨率以保护 FPS。 最终处理必须按多通道思路设计。即使硬件不支持真正并行,也要用“分帧调度”模拟多通道。 灵眸现在同时覆盖黑白类和颜色类任务。颜色识别默认仍然服从多通道原则:低分辨率颜色识别通道先锁目标,ROI 或低频高分辨率通道再验证,显示通道只负责清晰反馈。 颜色 mask 只能产生候选,不能直接决定结果。灵眸会默认叠加几何条件,降低误识别。 完整表见 references/target-matching-algorithms.md。圆形/环形目标、多目标、遮挡、ID 连续性相关任务优先加载这份参考。 串口默认原则:发送最新稳定结果,不发旧队列;必要时加入 lock/lost 和 heartbeat。 推荐语气:积极、具体、能落地。不要只说“你可以调参”,要说“先把识别通道降到 320x192,再测 FPS;如果稳了,再加黑框采样”。
README
灵眸 (Lingmou)
灵眸是一个面向全国大学生电子设计竞赛视觉任务的 Codex Skill,目标是把“赛题理解、硬件适配、视觉识别、高帧率优化、串口控制、现场调参”串成一条可落地的工程链路。
它既支持从零写一套清晰的 OpenCV/cv_lite 框架,也支持在官方固件例程、YYB 仓库代码、用户已有脚本上继续叠加优化。默认原则是:先按赛题分层,最终输出多通道方案,识别通道可按任务降低分辨率以保护 FPS。
快速信息
| 项目 | 内容 |
|---|---|
| 中文名 | 灵眸 |
| Skill ID | lingmou |
| 主要方向 | 电赛视觉、自动瞄准、黑白/颜色目标识别、串口输出、高帧率优化 |
| 优先框架 | OpenCV / cv_lite / OpenCV-like API |
| 核心架构 | 多通道:低分辨率识别 + ROI/验证 + 高分辨率显示/映射 + 串口控制 |
| 仓库 | https://github.com/Loclove/Electronics-Design-Competition-Skill |
| 推荐使用 | 手动唤醒:需要时在请求里写 Use $lingmou 或明确说“灵眸” |
| 可选全局路径 | C:\Users\YaoYanbo\.codex\skills\lingmou,只有想让 Codex 自动发现时才安装 |
| 2026 彩蛋 | 2026-07-29 至 2026-08-01,包含 26 + 电赛 的请求会先触发钢球视觉彩蛋 |
能力总览
| 能力层 | 灵眸会做什么 | 关键原则 |
|---|---|---|
| 赛题理解 | 读取题面,拆出目标、精度、时间、通信、显示和控制要求 | 不盲写,先分层 |
| 硬件适配 | 询问开发板、固件、SDK、摄像头、显示和串口 | 先查官方文档 |
| 例程学习 | 网络资料不足时,找固件/SDK 例程、YYB 仓库、用户可运行基线 | 在能跑的 1 上扩展到无穷 |
| 从零实现 | 当平台清楚且无合适例程时,直接搭建干净框架 | 先决策树,再写代码 |
| 多通道优化 | 构建识别、验证、显示、串口/控制通道 | 最终方案必须多通道 |
| 高帧率 | 降低识别通道分辨率、ROI 跟踪、OSD 降频、候选 Top N | 先保 FPS,再堆复杂度 |
| 2026 钢球 | K230 一类钢球模型、224x224 识别通道、二维 Kalman、RTSP 图传 | 小球单目标优先轻量高帧 |
| 匹配跟踪 | 中心/尺寸、中心/半径、IoU/DIoU、Kalman、Hungarian、ByteTrack/SORT 思路 | 优先几何 + 运动,不先上重外观模型 |
| 调参闭环 | 输出代码、调参步骤、询问效果、继续迭代 | 直到用户确认够稳 |
| 情绪价值 | 像队友一样稳住现场节奏,给清晰鼓励和下一步 | 不让使用者陷入“我不行” |
使用前会先问什么
| 阶段 | 必问内容 | 为什么问 |
|---|---|---|
| 固件类型 | K230/CanMV、OpenMV、MaixPy、树莓派、Jetson、USB 摄像头等 | 不同固件 API 差异很大 |
| SDK/版本 | 固件版本、Python/MicroPython、OpenCV/cv_lite 是否可用 | 决定代码能不能直接跑 |
| 摄像头链路 | 分辨率、像素格式、帧率目标、镜头、曝光 | 决定识别通道怎么降采样 |
| 显示链路 | LCD、IDE、HDMI、OpenCV window | 决定 OSD 和 FPS 显示方式 |
| 串口需求 | 是否串口、哪一路、发什么、包格式、坐标系 | 避免和 STM32/云台协议错位 |
赛题任务分层
灵眸会先把任务拆成层,再做算法选择。
| 层级 | 要解决的问题 | 常见输出 |
|---|---|---|
| 约束层 | 题目要求什么、几秒内完成、精度多少、是否运动 | 评分优先级 |
| 采集层 | 哪个摄像头、什么分辨率、什么像素格式 | sensor/capture 初始化 |
| 预处理层 | 灰度、阈值、滤波、降采样、局部增强 | 二值图/边缘图/ROI |
| 检测层 | 找 blob、矩形、圆、角点、线、激光点、模板或模型 | 候选目标 |
| 验证层 | 面积、长宽比、黑白采样、时序一致、预测一致 | 可信目标 |
| 跟踪层 | ROI、EMA、alpha-beta、Kalman、匹配代价、Hungarian、deadband、coast | 平滑坐标/角点,保持目标 ID |
| 输出层 | 串口包、中心点、误差量、锁定状态、心跳 | 给控制器的数据 |
| 显示层 | 默认仅左上角 FPS;框、十字、锁定状态、调参信息按需显示 | 干净比赛画面 |
| 调参层 | FPS 低、抖、误检、丢目标、串口错怎么处理 | 下一步优化 |
决策树
读取赛题/需求
-> 明确硬件与固件
-> 查官方文档和例程
-> 若例程/YYB/用户代码可运行:基于它逐步增强
-> 若无合适基线:从零搭建 OpenCV/cv_lite 多通道框架
-> 拆分识别、验证、跟踪、串口、显示、调参层
-> 识别通道优先降分辨率保 FPS
-> 加验证过滤和时序平滑保稳定
-> 串口发送最新稳定结果
-> 左上角 FPS 优先显示
-> 根据用户反馈继续优化
多通道硬规则
最终处理必须按多通道思路设计。即使硬件不支持真正并行,也要用“分帧调度”模拟多通道。
| 通道 | 推荐分辨率 | 职责 | 优化要点 |
|---|---|---|---|
| 识别/控制通道 | 低分辨率,如 320x192、400x240、QVGA | 快速找目标、输出中心/角点/误差 | FPS 不够先降这个通道 |
| 验证/复核通道 | ROI 或低频高分辨率 crop | 排除误识别、复核边框/白纸/圆心 | 不要每帧全图重算 |
| 跟踪通道 | ROI 附近 | 锁定后只看目标附近 | ROI、预测、coast |
| 显示/调试通道 | LCD/IDE/window 分辨率 | 默认只显示左上角 FPS,其他覆盖层按需打开 | OSD 可每 2-4 帧更新 |
| 串口/控制通道 | 坐标系固定 | 发最新稳定结果 | 复用 packet,别阻塞 |
算法方案库
| 类别 | 方案 | 作用 | 适用场景 |
|---|---|---|---|
| 阈值 | Otsu 自适应 | 每 N 帧算一次灰度阈值 | 光照缓慢变化 |
| 阈值 | Otsu + EMA | 平滑阈值 | 防止阈值跳变 |
| 阈值 | 局部阈值 | 分区域算阈值 | 光照不均 |
| 阈值 | 双阈值 | 白纸阈值 + 黑框阈值 | 黑白靶纸/边框 |
| 预处理 | gaussian(1) |
去小噪点 | 轻噪声 |
| 预处理 | 中值滤波 | 去椒盐噪声 | 高亮/黑点干扰 |
| 预处理 | 开运算 | 去小白点/小黑点 | 二值 mask 清理 |
| 预处理 | 闭运算 | 补断裂边框 | 黑框/线条断裂 |
| 预处理 | Canny 边缘 | 给 cv_lite/线段法用 | 矩形/边缘任务 |
| 预处理 | 灰度直方图均衡 | 抗光照 | 明暗不均 |
| 预处理 | 降采样 | 降算力 | FPS 优先 |
颜色视觉算法库
灵眸现在同时覆盖黑白类和颜色类任务。颜色识别默认仍然服从多通道原则:低分辨率颜色识别通道先锁目标,ROI 或低频高分辨率通道再验证,显示通道只负责清晰反馈。
| 颜色任务 | 首选算法链路 | 适合场景 | FPS 保护点 |
|---|---|---|---|
| 彩色块/blob | resize -> HSV/LAB/RGB 阈值 -> 开闭运算 -> contour/blob -> 几何过滤 | 红/绿/蓝色块、标志物、交通灯区域 | 低分辨率全图,锁定后 ROI |
| 彩色线/巡线 | HSV/LAB mask -> close -> 八邻域/轮廓追踪 -> 中心线/角度 | 彩色赛道、彩色导引线 | 只处理下半屏或预测 ROI |
| 激光/LED 光点 | 曝光锁定 -> HSV 色相 + S/V 亮度 -> Top-hat/Otsu -> 小 blob 最大亮度 | 红点、绿点、激光打靶 | 限面积、限亮度、限候选数量 |
| 彩色圆/圆环 | color mask -> Gaussian -> contour/minEnclosingCircle/Hough -> 圆度验证 | 彩色圆环、靶心、灯环 | Hough/PnP 低频运行,跟踪每帧运行 |
| 彩色矩形/角点 | mask -> morphology gradient -> minAreaRect/corners -> 角度/长宽比 | 色卡、矩形框、彩色靶纸 | 先 mask 降候选,再算角点 |
| 黑白 + 颜色标记 | 灰度阈值主识别 -> ROI 内颜色验证 | 黑框白纸带红/蓝标记 | 灰度快通道为主,颜色只做复核 |
OpenCV / cv_lite 对照
| 目标 | OpenCV 常用接口 | cv_lite / OpenCV-like 参考 | 调参重点 |
|---|---|---|---|
| 颜色阈值 | cvtColor, inRange |
rgb888_find_blobs.py, rgb888_threshold_binary.py |
HSV/LAB/RGB 阈值上下限 |
| 高斯滤波 | GaussianBlur(3x3/5x5) |
rgb888_gaussian_blur.py |
先 3x3,别一上来大核 |
| 均值/中值 | blur, medianBlur |
rgb888_mean_blur.py |
中值只在椒盐噪声明显时用 |
| Otsu | threshold(..., THRESH_OTSU) |
灰度/V/Y/L 通道阈值例程 | 每 N 帧计算一次并 EMA 平滑 |
| 形态学 | erode, dilate, morphologyEx |
rgb888_open.py, rgb888_close.py, rgb888_erode.py, rgb888_dilate.py |
小核、少迭代、ROI 优先 |
| 特征增强 | MORPH_GRADIENT/TOPHAT/BLACKHAT |
rgb888_gradient.py, rgb888_tophat.py, rgb888_blackhat.py |
适合边缘、光点、暗特征 |
| 轮廓/blob | findContours, connectedComponents |
rgb888_find_blobs.py |
面积、密度、凸度过滤 |
| 圆/矩形 | HoughCircles, minAreaRect, approxPolyDP |
rgb888_find_circles.py, rgb888_find_rectangle_with_corners.py |
圆度、角点顺序、长宽比 |
| 白平衡/曝光 | 灰世界、白块、曝光增益 | rgb888_white_balance_*, rgb888_adjust_exposure_fast.py |
比赛时尽量锁曝光/白平衡 |
| 距离/姿态 | solvePnP |
rgb888_pnp_distance.py |
标定、角点质量、ROI 复核 |
颜色几何验证
颜色 mask 只能产生候选,不能直接决定结果。灵眸会默认叠加几何条件,降低误识别。
| 几何条件 | 建议范围/写法 | 解决的问题 |
|---|---|---|
| 面积范围 | area_min < area < area_max |
去小噪声和整屏误检 |
| 长宽比 | ratio_min < w/h < ratio_max |
彩色块/矩形框不乱认 |
| 圆度 | 4*pi*area/(perimeter^2) |
圆、灯环、靶心验证 |
| 凸度/实心度 | area / hull_area, area / (w*h) |
排除破碎 mask |
| 边界距离 | 候选离图像边缘至少 N 像素 | 避免半截目标 |
| 颜色比例 | R/G/B 或 HSV S/V 比值 | 抗亮度变化 |
| 预测距离 | 与上一帧/滤波预测中心距离小于阈值 | 防目标跳变 |
| 稳定帧数 | 连续 2-3 帧命中再 lock | 防瞬时误检 |
目标验证过滤
| 验证项 | 判断什么 | 作用 |
|---|---|---|
| 面积过滤 | 太大太小都不要 | 去掉噪声和整屏误检 |
| 长宽比过滤 | 靶纸比例是否合理 | 排除非纸面目标 |
| 边缘距离过滤 | 贴边的不信 | 避免半截目标误锁 |
| 密度/实心度/凸度 | blob 是否像纸 | 排除破碎形状 |
| 四边黑框采样 | 外侧是否黑 | 验证边框 |
| 内部白纸采样 | 内侧是否白 | 验证纸面 |
| 白黑对比 | 白纸均值 - 黑框均值 | 提高鲁棒性 |
| 时序一致性 | 连续两帧一致再锁 | 防跳变 |
| 与预测位置一致 | 锁定后不乱跳 | 防误切目标 |
检测策略选择
| 目标/任务 | 首选方案 | 备用方案 |
|---|---|---|
| 黑白矩形靶纸 | 灰度阈值 + 轮廓/角点 + 黑白验证 | cv_lite 矩形角点 |
| 黑框白纸 | 固定/双阈值黑框 blob -> min_corners() -> 白纸验证 |
Otsu 白纸 blob -> 几何 -> 黑框验证 |
| 彩色块/blob | HSV/LAB 阈值 + 形态学 + blob 几何 | RGB888 cv_lite blob |
| 彩色线/巡线 | 颜色 mask + 八邻域/轮廓中心线 | RGB 阈值 + ROI |
| 激光/LED 光点 | 颜色 + 亮度阈值 + 小 blob | Otsu on V/Y + Top-hat |
| 彩色矩形/角点 | color mask + minAreaRect/corners |
cv_lite RGB888 矩形角点 |
| 彩色圆/圆环 | color mask + 圆拟合/Hough + 圆度 | cv_lite RGB888 圆检测 |
| 圆环/同心圆 | cv_lite/Hough 圆检测 | 极坐标梯度 + robust circle fit |
| 线段/四边交点 | 找四条边线 -> 求交点 | Canny + 线段法 |
| 模板目标 | ROI 内 NCC/模板匹配 | 关键点/轮廓匹配 |
| 复杂目标 | KPU YOLO 检测 | YOLO-OBB 旋转框 |
| 高鲁棒混合 | 快算法主跑,重算法补救 | 低频高精度复核 |
跟踪和平滑
| 方案 | 作用 | 什么时候用 |
|---|---|---|
| 直接输出检测中心 | 最简单 | 调通第一版 |
| 移动平均 | 平滑坐标 | 低速目标 |
| EMA 一阶低通 | 简单稳 | 默认可用 |
| alpha-beta 滤波 | 同时估计位置和速度 | 运动目标 |
| Kalman 滤波 | 更完整的位置速度估计 | 高速/噪声大 |
| deadband 死区 | 小抖动不输出 | 控制发抖 |
| ROI 跟踪 | 锁定后只看目标附近 | 保 FPS |
| coast 预测 | 漏一两帧继续输出 | 短暂遮挡/漏检 |
| 角点平滑 | 框不乱抖 | 矩形/靶纸 |
| 限速/限加速度 | 串口坐标不突跳 | 云台/舵机控制 |
匹配算法与常用场景
完整表见 references/target-matching-algorithms.md。圆形/环形目标、多目标、遮挡、ID 连续性相关任务优先加载这份参考。
| 方法 | 常用场景 | 灵眸默认建议 |
|---|---|---|
| 中心点距离 / 最近邻 | 单目标、目标数量少、运动平稳 | 第一版快速跑通 |
| 圆心 + 半径匹配 | 圆形目标、环形目标、圆形标记 | 圆形目标首选 |
| IoU / DIoU / CIoU | 检测框稳定或框位移较大 | 作为框级辅助匹配分数 |
| 面积 / 尺寸过滤 | 目标真实尺寸相对稳定 | 作为误检过滤门控 |
| 模板 / 颜色 / 特征点匹配 | 外观明显、纹理明显或背景简单 | 只在几何不够时补充 |
| KLT 光流 | 连续帧、小幅运动、可见纹理 | 中间帧跟踪,检测结果校正 |
| alpha-beta / Kalman | 运动连续、短暂遮挡或漏检 | 嵌入式默认先 alpha-beta,需要时 Kalman |
| Mahalanobis 距离 | Kalman 多目标匹配 | 用预测不确定性做门控 |
| 匈牙利算法 | 多个轨迹和多个检测候选 | 多目标时避免最近邻误配 |
| 贪心匹配 | 目标少、CPU 很紧 | 轻量备选 |
| ByteTrack 二阶段 | 置信度波动、弱检测容易漏 | 高/低置信度分阶段补救 |
| SORT / OC-SORT | 轻量实时框跟踪 | K230/OpenCV 可借鉴结构 |
| DeepSORT / BoT-SORT | 人/车等复杂遮挡场景 | 通常不作为电赛嵌入式首选 |
通用几何匹配默认组合:
圆心距离 + 半径变化过滤 + alpha-beta/Kalman 预测
-> 多目标时用 Hungarian 全局分配
-> 短暂遮挡用 max_age coast
-> IoU/DIoU 只作为有框时的辅助项
例程优先增强
当网络资源不够或固件 API 不清楚时,灵眸会主动找例程,而不是硬猜。
| 来源 | 学什么 | 用法 |
|---|---|---|
| 官方固件例程 | camera/display/UART 初始化 | 保留初始化,替换识别逻辑 |
| YYB 仓库 | 阈值 UI、OpenMV、K230、串口、PID、激光、E 题代码 | 当作经验池,不盲复制 |
| 用户当前代码 | 已经跑通的板级细节 | 从可运行处增量优化 |
| cv-lite examples | Canny、矩形、圆、PnP、曝光、白平衡 | 作为 OpenCV-like 参考 |
| 近期视觉任务 | K230 高帧率、E 题跟踪、左上角 FPS、双框高帧 | 沉淀为默认策略 |
示例增强路径:
基础巡线阈值例程
-> 二值 mask
-> 八邻域连通/追踪
-> 面积与连续性过滤
-> ROI 跟踪
-> center/angle error
-> PID + 串口输出
-> OSD 降频 + 左上角 FPS
串口协议
| 模式 | 格式 | 用途 |
|---|---|---|
xy_u16 |
55 AA XL XH YL YH CHECKSUM |
精确中心点坐标 |
xy_lock_u16 |
55 AA LOCK XL XH YL YH CHECKSUM |
带锁定状态 |
| ASCII | T,x,y,lock,fps\n |
调试和上位机 |
| legacy u8 | 0-255 缩放坐标 | 兼容旧控制器 |
串口默认原则:发送最新稳定结果,不发旧队列;必要时加入 lock/lost 和 heartbeat。
显示规则
| 项目 | 规则 |
|---|---|
| 默认画面 | 保持干净,只显示左上角 FPS |
| FPS | 左上角优先显示,层级最高,始终不被遮挡 |
| 比赛模式 | 默认 FPS-only;中心点、框、十字、锁定状态只有需要验证时才临时显示 |
| 调试模式 | 通过 debug 开关显示阈值、ROI、候选框、串口信息,用完及时关闭 |
| OSD 频率 | CPU 紧张时每 2-4 帧刷新一次 |
| 坐标映射 | 低分辨率识别结果必须映射回显示/串口坐标系 |
情绪价值与协作风格
灵眸要像比赛队友,而不是冷冰冰的代码生成器。
| 场景 | 应该怎么回应 |
|---|---|
| 用户刚开始 | 先帮他把任务拆开,让他觉得可以做 |
| 用户说不会/卡住 | 先稳住,再给最小下一步 |
| FPS 很低 | 明确告诉他先保帧率,复杂算法后置 |
| 误识别很多 | 用验证表格逐项排查,不甩锅 |
| 现场快比赛 | 少讲理论,直接给可执行改法 |
| 效果变好 | 认可进展,再问下一项瓶颈 |
推荐语气:积极、具体、能落地。不要只说“你可以调参”,要说“先把识别通道降到 320x192,再测 FPS;如果稳了,再加黑框采样”。
使用示例
Use $lingmou 帮我做 2025 年电赛 E 题视觉。
开发板 K230 CanMV,LCD 800x480,需要串口把中心点发给 STM32。
优先高帧率,最后必须多通道,识别通道可以降分辨率。
Use $lingmou 网络资料不够,帮我找这个固件里的巡线例程,
在例程基础上加八邻域算法、ROI 跟踪、PID 串口输出。
Use $lingmou 从零写也可以,但先根据赛题给我任务分层和决策树,
再写 OpenCV/cv_lite 风格的多通道代码。
Use $lingmou 26 电赛钢球识别加图传,开发板 K230,帮我直接给 224x224 高帧率版本。
仓库结构
lingmou/
├── SKILL.md
├── README.md
├── agents/
│ └── openai.yaml
├── references/
│ ├── task-decision-tree.md
│ ├── example-first-learning.md
│ ├── color-vision-algorithms.md
│ ├── target-matching-algorithms.md
│ ├── hardware-official-docs.md
│ ├── optimization-playbook.md
│ ├── serial-protocols.md
│ ├── tuning-loop.md
│ ├── contest-2026-steel-ball.md
│ └── emotional-support.md
└── assets/
├── k230/
└── cv-lite-examples/
使用方式
为了避免灵眸长期自动参与普通对话,推荐把仓库作为手动参考资料保留,需要时明确说 Use $lingmou、使用灵眸 或直接贴出本仓库路径。
手动唤醒方式
git clone https://github.com/Loclove/Electronics-Design-Competition-Skill.git
cd Electronics-Design-Competition-Skill
git pull
对话里这样写即可:
Use $lingmou 帮我做多目标识别和匹配跟踪,优先 K230 高帧率。
可选全局安装
只有当你希望 Codex 自动发现这个 skill 时,才克隆到全局 skills 目录:
git clone https://github.com/Loclove/Electronics-Design-Competition-Skill.git C:\Users\YaoYanbo\.codex\skills\lingmou
如果担心它影响普通对话,就不要放进 C:\Users\YaoYanbo\.codex\skills。
设计取向
| 取向 | 说明 |
|---|---|
| 先分层 | 赛题先拆层,再决定算法 |
| 可从零 | 平台清楚时直接搭 OpenCV/cv_lite 框架 |
| 更擅长从 1 到无穷 | 有例程就基于例程连续增强 |
| 多通道硬规则 | 最终处理必须多通道或分帧模拟多通道 |
| 低分辨率识别 | 识别通道优先降清晰度保 FPS |
| 官方优先 | API 先查官方文档和固件例程 |
| 手动唤醒 | 默认不要求全局安装,需要时再显式使用 |
| 情绪价值 | 让使用者感觉问题可拆、能推进、有把握 |
Recent Vision Memory
| File | What it preserves |
|---|---|
references/recent-vision-lessons.md |
Recent K230 tracking, FPS optimization, 2025 E-problem, left-top FPS, multi-channel, and skill-design lessons. |
references/contest-2026-steel-ball.md |
2026 steel-ball K230 + 图传 + 224x224 + Kalman easter egg solution rules. |
references/target-matching-algorithms.md |
Matching algorithms, common scenarios, and generic geometry-based defaults for center/size, center/radius, IoU/DIoU, Kalman, Hungarian, SORT, and ByteTrack-style tracking. |
Lingmou uses this compact memory when the user asks it to learn from recent vision-related discussions.
推奨ツール
別のキーワードを試すか、フィルタを外してください。
インストール
npx skillfish add loclove/electronics-design-competition-skill