OpenMV在电赛视觉控制中的实战应用:从硬件选型到算法实现
1. 项目缘起与核心挑战为什么是OpenMV去年带队参加电赛我们组抽到了那道经典的E题——运动目标控制与自动追踪系统。题目要求很明确一个在二维平面上自由滚动的小球一个由舵机驱动的平板你需要让系统自动识别小球位置并实时控制平板倾斜将小球引导至指定区域或沿指定轨迹运动。题目一出来实验室里瞬间分成了两派一派主张上树莓派OpenCV觉得性能强、库丰富另一派包括我在内坚定地选择了OpenMV。最后的事实证明在电赛这种对实时性、稳定性和开发效率要求近乎苛刻的场合OpenMV往往是更优解甚至可以说是“版本答案”。为什么这么说电赛E题这类视觉控制题目核心痛点从来不是算法的绝对精度而是在有限资源时间、算力、供电下的稳定、可靠输出。树莓派性能固然强大但随之而来的是复杂的Linux环境配置、潜在的驱动兼容性问题、相对较高的功耗以及最要命的——图像处理循环的时序不确定性。你可能花一天时间调通了摄像头标定和颜色识别算法但下一秒因为系统调度导致处理延迟了几十毫秒整个PID控制环直接就崩了。OpenMV则不同它生来就是为嵌入式机器视觉设计的。其MicroPython环境极度精简摄像头驱动、图像传感器控制、基础图像处理函数找色块、找直线、模板匹配都是底层高度优化的执行时间可预测、可测量。对于E题这种典型的“摄像头在上方俯拍识别一个颜色鲜明的小球”的场景OpenMV的find_blobs函数一行代码就能稳定输出目标的坐标、大小其效率和稳定性是我们在赛前用树莓派反复调试都难以企及的。所以当你拿到类似E题的任务书第一反应不应该是“什么技术最炫酷”而是“什么方案最能在4天3夜里稳定跑通”。OpenMV提供了一个近乎“开箱即用”的视觉解决方案硬件集成度高摄像头、处理器、IO口一体开发环境简单基于Python的IDE支持直接烧录脚本通信接口丰富UART、I2C、SPI等方便与STM32等主控通信。它的强项在于将复杂的视觉信号快速、可靠地转化为几个关键的数值如XY坐标色块面积而这正是运动控制最需要的输入。这次分享我就以2023年E题为例拆解从环境搭建、算法选型、参数调试到与主控联调的完整流程特别是那些在官方教程里不会提但实际比赛中能救命的细节和“坑”。2. 硬件选型与环境搭建不止是插上USB工欲善其事必先利其器。电赛视觉部分硬件是地基地基不稳算法再精妙也是空中楼阁。2.1 OpenMV选型H7 Plus是性价比之选OpenMV有几个主流型号OpenMV Cam M7、OpenMV Cam H7和OpenMV Cam H7 Plus。对于电赛E题我强烈推荐OpenMV Cam H7 Plus。原因有三第一它搭载的STM32H7芯片主频更高480 MHz处理640x480分辨率的图像进行实时色块查找毫无压力为后期可能需要的多目标识别或简单滤波算法留出了算力余量。第二也是最重要的一点H7 Plus标配的是全局快门摄像头模块而基础版H7是卷帘快门。在E题场景中小球是快速运动的。如果使用卷帘快门拍摄运动物体会产生“果冻效应”导致识别出的色块形状扭曲、中心坐标抖动严重影响控制精度。全局快门则能有效避免这个问题确保每一帧图像都是瞬间曝光对于动态目标捕捉至关重要。多出来的几十块钱预算在稳定性和数据质量上的提升是决定性的。2.2 供电与固定被忽视的稳定性杀手很多队伍在测试时一切正常一旦装上赛架系统就开始间歇性抽风。问题往往出在供电和机械固定上。供电绝对不要依赖电脑USB口为OpenMV长期供电。电脑USB口的电压和电流并不稳定尤其是在笔记本电脑上。正确的做法是使用一个独立的5V/1A以上的手机充电头或稳压模块为其供电。如果整个系统有统一的12V或24V电源务必通过DC-DC降压模块如LM2596产生稳定的5V给OpenMV。电源线上的噪声是图像传感器的大敌会导致图像出现横条纹噪点直接影响识别阈值。我们曾在电源线上串了一个磁珠图像质量有肉眼可见的改善。固定与视角摄像头的固定方式直接决定了坐标系是否稳定。首先必须将OpenMV牢固地固定在赛架顶部确保在整个比赛过程中不会因电机震动或人为触碰而发生位移或转动。其次镜头的俯仰角要尽量保证光轴与平板平面垂直。任何倾斜都会引入透视畸变导致平板边缘和中心的像素当量每个像素代表的实际毫米数不一致。虽然可以通过标定来校正但在争分夺秒的电赛里尽量从物理上减少误差源是更明智的选择。我们使用了简单的激光笔辅助对焦和找垂直效果很好。2.3 开发环境与固件一步错步步错去OpenMV官网下载最新的IDE。安装后第一件事不是写代码而是连接摄像头更新固件到最新稳定版。固件版本不匹配是很多诡异问题的根源比如某些函数无法使用或行为异常。更新固件在IDE里很简单点一下就好。接着在“工具”-“设置”里将“保存脚本到OpenMV Cam”的选项勾上这样你的脚本会直接保存在OpenMV的板载Flash里脱离电脑也能运行。然后我建议创建一个纯净的工程目录里面只放你为这个项目写的脚本。不要直接在IDE的示例脚本上改容易混淆。新建一个main.py这就是OpenMV上电后自动运行的脚本。3. 核心算法实现从图像到坐标的“黑盒”E题视觉部分的核心任务就一个在每一帧图像中找到小球并输出其中心在图像坐标系下的坐标x y。听起来简单但要让这个输出在光线变化、小球快速移动、甚至存在干扰色块的情况下依然稳定需要一套组合拳。3.1 图像预处理与ROI设定直接在全分辨率图像上搜索色块是低效的。我们的第一步是设定感兴越区域ROI。因为小球只会在平板上运动所以我们可以把搜索范围限定在平板所在的矩形区域内。这不仅大幅减少了需要处理的像素数量提升了帧率更重要的是避免了背景中可能存在的、颜色与小球的干扰物。import sensor, image, time # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) # 必须用RGB565才能进行彩色识别 sensor.set_framesize(sensor.QVGA) # 320x240分辨率平衡速度与精度 sensor.skip_frames(time 2000) # 让摄像头自动调节增益和白平衡 clock time.clock() # 定义平板的ROI (假设平板在图像中占据的区域) # 格式 (x, y, width, height) 需要根据你的实际安装位置调整 PLATFORM_ROI (50, 30, 220, 180)接下来是颜色阈值。这是整个视觉识别的基石。OpenMV的find_blobs函数需要一组LAB颜色空间的阈值。LAB颜色空间比RGB更能抵抗光照变化的影响。获取阈值的最佳方法不是猜而是使用OpenMV IDE自带的“工具”-“机器视觉”-“阈值编辑器”。在这个工具里你可以实时看到摄像头画面用鼠标框选小球工具会自动计算并给出LAB阈值的建议范围。把这个范围记下来。但注意赛场灯光可能和你实验室的不一样。因此你的阈值需要有一定的容错性。通常的做法是适当放宽B通道黄蓝通道的范围因为光照变化主要影响亮度L通道和蓝黄色调。我们的策略是在实验室多种光照条件下开灯、关灯、开窗帘测试取一个能覆盖所有情况的“最大公约数”阈值。虽然这样可能会引入一些噪声但可以通过后续的面积过滤和像素点数量过滤来剔除。3.2 色块查找与滤波有了ROI和阈值就可以进行核心的色块查找了。while(True): clock.tick() img sensor.snapshot() # 抓取一帧图像 # 在ROI内寻找色块 blobs img.find_blobs([YOUR_THRESHOLD], roiPLATFORM_ROI, pixels_threshold100, area_threshold100, mergeTrue) if blobs: # 通常面积最大的色块就是我们要的小球 largest_blob max(blobs, keylambda b: b.pixels()) # 进一步滤波确保色块面积在合理范围内避免识别到反光点等小噪声 if 500 largest_blob.pixels() 5000: # 面积阈值需要根据小球实际像素大小调整 # 在图像上画出小球的轮廓和中心用于调试 img.draw_rectangle(largest_blob.rect()) img.draw_cross(largest_blob.cx(), largest_blob.cy()) # 获取中心坐标 ball_x largest_blob.cx() ball_y largest_blob.cy() # 这里可以添加坐标发送逻辑见第4部分这段代码有几个关键点pixels_threshold和area_threshold这是初步滤波忽略像素数或面积太小的噪点。初始值可以设小一点比如50然后根据现场情况调整。mergeTrue这个参数非常重要。当小球颜色比较纯、光照均匀时find_blobs可能会把一个小球识别成几个相邻的色块。开启合并后相邻且颜色相似的色块会被合并成一个大大提高了识别的鲁棒性。面积二次滤波即使经过初步阈值过滤仍可能有其他同色系的小面积干扰如导线胶皮、裁判服装的反光。通过判断色块的像素面积是否在一个合理的物理范围比如对应直径1cm到3cm的小球可以非常有效地排除干扰。这个范围需要你在赛前标定好。3.3 坐标变换与标定从像素到毫米find_blobs返回的cx, cy是图像像素坐标。而你的舵机控制需要的是平板坐标系下的物理坐标单位毫米。这就需要标定。最实用的方法是两点标定法。在平板上固定两个已知物理坐标的点比如平板的两个对角用OpenMV识别出它们的像素坐标。假设物理点A(x1_mm, y1_mm)对应像素点A(u1, v1)物理点B(x2_mm, y2_mm)对应像素点B(u2, v2)。由于摄像头安装近似垂直且平板在一个平面上我们可以用最简单的线性映射仿射变换来近似。你不需要自己写变换矩阵。一个更工程化的做法是在代码里记录下这两个参考点的像素坐标然后通过比例换算。例如对于X坐标物理X (像素X - u1) * ( (x2_mm - x1_mm) / (u2 - u1) ) x1_mmY坐标同理。把这个换算公式集成到你的循环里。注意这个标定需要在摄像头最终固定位置后进行一次。如果比赛中间不小心碰到了摄像头整个标定就失效了所以物理固定一定要牢靠4. 与主控通信稳定可靠的数据管道视觉识别出坐标只是第一步如何将坐标实时、无误地传递给负责运动控制的主控芯片通常是STM32是另一个关键。UART串口通信是最常用、最可靠的方式。4.1 OpenMV端封装与校验不要在循环里直接print(ball_x, ball_y)。这种原始数据没有结构主控端很难解析也容易因数据不完整导致解析错误。我们需要定义一个简单的通信协议。import ustruct def send_data(x, y): # 定义一个数据包帧头2字节‘AB’ 数据2个short4字节 校验和1字节 帧尾1字节‘\n’ # 假设x, y已经是整数类型的像素坐标或转换后的毫米坐标 data_head bAB # 使用ustruct将整数打包为字节h表示short2字节有符号整数 data_body ustruct.pack(hh, x, y) # 计算校验和简单求和后取低8位 checksum sum(data_body) 0xFF data_tail b\n # 组合成完整数据包 packet data_head data_body bytes([checksum]) data_tail uart.write(packet)然后在主循环中调用if 符合条件的小球被找到: send_data(ball_x, ball_y) else: # 发送一个特殊值例如(-1, -1)告知主控未找到目标 send_data(-1, -1)为什么这么做帧头帧尾帮助主控从数据流中准确切分出一个个完整的数据包。固定长度每个包长度固定24118字节主控解析逻辑简单。校验和确保数据传输过程中没有出错。这是电赛中极易忽略但至关重要的一点现场电磁环境复杂串口线稍长就可能受到干扰。未找到处理必须考虑小球跑出视野或被短暂遮挡的情况。发送一个约定的无效值如-1比不发送或发送旧坐标要好这样主控可以进入“搜索”或“保持”的安全模式。4.2 波特率与缓冲区将UART波特率设置为115200是一个较好的平衡点。太高了在长距离传输下容易出错太低了可能跟不上控制周期。在OpenMV IDE的“工具”-“串口终端”里可以方便地设置和测试。另外在OpenMV初始化时最好清空一下串口缓冲区避免残留数据干扰。uart UART(3, 115200) # 根据实际连接的串口编号修改 uart.init(115200, bits8, parityNone, stop1, timeout_char1000) uart.read() # 清空接收缓冲区5. 现场调试与抗干扰策略临场发挥的底气实验室里风平浪静比赛现场才是试金石。光线、电磁干扰、其他队伍的同类设备都是挑战。5.1 光照适应性调试赛场的顶灯可能色温不同或者有窗户的自然光干扰。我们的应对策略是准备多套阈值在IDE里保存几套针对不同典型光照条件的阈值如“强日光”、“暖色顶灯”、“弱光”并编写一个简单的函数在开机后通过判断图像整体亮度或平均颜色自动选择最接近的一套阈值。甚至可以做一个简单的自动阈值调整在系统初始化时让小球位于平板中心采样该区域的颜色动态计算阈值。启用自动曝光/白平衡sensor.skip_frames(2000)这一步就是让摄像头自动调节。在比赛开始前让系统对着比赛场景空跑2-3秒完成自动调节。利用图像直方图在调试时可以print(sensor.get_histogram())来查看图像的整体亮度分布辅助判断当前光照条件。5.2 应对电磁干扰与数据丢包多个队伍同时运行电机、开关电源会产生大量电磁噪声。屏蔽与接地使用带屏蔽层的USB线或串口线连接OpenMV和电脑调试时或主控。确保整个系统有一个良好的公共接地。主控端通信逻辑强化除了校验和主控端的接收程序要有超时机制。如果超过一定时间比如3个控制周期没收到有效的视觉数据就应判定视觉系统异常并采取安全策略如平板回平、电机停转。软件滤波对于视觉坐标即使在找到小球的情况下也可能因图像噪声产生1-2个像素的抖动。可以在OpenMV端或主控端对坐标进行简单的软件滤波如一阶低通滤波指数加权平均。filtered_x alpha * current_x (1 - alpha) * last_filtered_xalpha取值在0.1到0.3之间可以有效平滑数据又不至于引入太大延迟。5.3 性能优化与帧率保障帧率直接决定了控制系统的响应速度。在OpenMV IDE的左下角可以看到实际的帧率FPS。我们的目标是至少在QVGA分辨率下达到30FPS以上。关闭不必要的功能在最终代码中移除所有调试用的img.draw_*绘图函数和print语句它们会消耗大量时间。优化查找区域如果小球运动有规律比如基本在中心区域可以动态调整ROI进一步缩小搜索范围。检查循环瓶颈使用clock.tick()和print(clock.fps())来监控帧率定位耗时操作。6. 拓展思路当题目变得更复杂虽然2023年E题用基础色块查找就能解决但电赛题目在逐年进化。掌握以下思路可以应对更复杂的视觉任务。6.1 模板匹配与数字识别如果题目要求识别特定图案比如不同编号的方块或者数字比如显示在屏幕上的目标坐标就需要用到模板匹配。OpenMV内置了image.find_template函数。你需要事先准备好模板图片裁剪出要识别的图案保存为PPM格式。在现场通过匹配得分来判断是否找到及位置。缺点是速度较慢且对旋转和尺度变化敏感。对于数字识别如果字体固定模板匹配是可行的。如果字体多变可以考虑使用OpenMV的AprilTag功能。AprilTag是一种视觉基准标记系统类似于二维码但更适用于远距离、低分辨率识别。你可以将不同的数字制作成不同的AprilTagOpenMV可以非常快速稳定地识别出Tag的ID和精确的3D位姿包括旋转。这在需要高精度定位的题目中是个“大杀器”。6.2 多目标追踪与路径预测如果题目要求同时追踪多个不同颜色的小球或者预测小球的运动轨迹就需要更复杂的逻辑。多目标为不同颜色定义不同的阈值列表分别调用find_blobs。然后为每个色块分配ID并通过帧间位置关联如最近邻匹配来实现简单追踪。路径预测在控制循环中不仅记录当前坐标还保留过去几帧的坐标。通过计算连续帧间的位移可以估算出小球的速度向量。结合平板的控制模型可以提前预测小球未来位置实现超前控制这对于高速运动的球体控制至关重要。这已经进入了“预测控制”的范畴是拉开差距的关键。6.3 与高级算法的结合OpenMV本身算力有限但可以通过串口将原始图像或特征数据发送给性能更强的协处理器如K210、树莓派Zero 2W进行更复杂的处理如使用轻量级神经网络进行目标分类。OpenMV负责前期的图像采集和预处理复杂模型运行在协处理器上两者通过高速串口或SPI通信。这是一种折中的高性能方案。回过头看2023年E题的视觉部分用OpenMV实现是一个高度契合赛事特点的选择。它把我们从复杂的环境配置和底层驱动中解放出来让我们能专注于核心的控制算法逻辑调试。整个备赛和比赛过程实际上是一个不断将理论方案工程化、稳定化的过程。视觉作为系统的“眼睛”其可靠性是控制环路稳定的前提。我所分享的这些从硬件选型、阈值调试到通信协议每一个环节都来自于实际踩过的坑和有效的解决方案。最后给备赛同学的建议是尽早确定视觉方案并开始联调把大部分时间留给整个系统的集成测试和抗干扰演练。视觉部分的代码可能只占你总代码量的十分之一但它所花费的调试时间很可能超过其他部分的总和。当你看到小球在平板上稳稳地沿着预定路径滚动时就会觉得这一切的折腾都是值得的。

相关新闻

基于改进BOXINST的数字识别算法研究

基于改进BOXINST的数字识别算法研究

概述 本项目旨在研究基于改进BOXINST的数字识别算法,针对实验室数字显示屏的识别任务。项目采用目标检测类型,数据集包含10个数字类别(0-9)。后端算法基于BOXINST\boxinst_r50_fpn_ms-90k_coco进行改进,前端技术栈采用…

2026/10/19 20:58:53 阅读更多 →
光速不变和光速极限-3

光速不变和光速极限-3

如果这个角速度,恰好就是当前位置地球自转的角速度,那么这就相当于,站在地面上的观察者,观察到的离开地面不同高度上的两个点。这是什么意思呢?意思就是地面上的相对静止,实际上是指数单增同时也是相当复杂…

2026/10/17 18:17:36 阅读更多 →
ABAP开发核心:深入理解RANGE与SELECTION-OPTIONS的数据筛选机制

ABAP开发核心:深入理解RANGE与SELECTION-OPTIONS的数据筛选机制

1. 项目概述:为什么每个ABAPer都必须吃透RANGE与SELECTION-OPTIONS?如果你在SAP ABAP开发中写过报表程序,那么对SELECTION-OPTIONS这个关键字一定不陌生。它是在选择屏幕上创建范围选择输入框的标准方式,用户可以在里面输入单个值…

2026/10/19 10:03:00 阅读更多 →

最新新闻

DNS故障排查与监控实战:从原理到告警SOP

DNS故障排查与监控实战:从原理到告警SOP

作为常年跟线上故障打交道的运维,我最大的感受就是:DNS问题是最让人头疼的“隐形杀手”。表面上看,用户访问不了服务,监控面板上数据库、缓存、带宽全都正常,但服务就是进不去。前几天某知名国际化社交平台出现的大规模…

2026/10/21 6:15:31 阅读更多 →
Hadoop+Spark+Hive游戏推荐系统毕业设计全流程实战

Hadoop+Spark+Hive游戏推荐系统毕业设计全流程实战

1. 项目概述与整体认知如果你正在为毕业设计发愁,看到“hadoopsparkhive游戏推荐系统”这种组合,大概率心里没底:这三样东西都是大数据领域绕不开的重型框架,单拎一个出来都够写好几篇论文,三个放一起还要做一个推荐系…

2026/10/21 6:15:31 阅读更多 →
教培机构销售工作台:公海与私海客户流转机制设计

教培机构销售工作台:公海与私海客户流转机制设计

1. 公海与私海:先搞清楚客户池怎么分干教培销售管理这些年,我见过太多团队死磕“线索分配不均”这个问题。新顾问抱怨拿到的名单质量差,老顾问嫌手里的客户跟不动,主管夹在中间天天当裁判。其实问题往往不在人,而在客户…

2026/10/21 6:15:31 阅读更多 →
VSCode搭建ROS开发调试环境全攻略:从配置到断点调试

VSCode搭建ROS开发调试环境全攻略:从配置到断点调试

用VSCode搭建ROS开发调试环境这件事,我从抗拒到真香,中间隔了一次难熬的排查经历。之前写ROS(Robot Operating System,机器人操作系统)代码,我习惯gedit开文件、终端敲命令、printf打印调试,这套…

2026/10/21 6:15:31 阅读更多 →
技能清单总白写?从四分类到能力地图,教你建立可验证的技能管理体系

技能清单总白写?从四分类到能力地图,教你建立可验证的技能管理体系

1. 先搞清楚一件事:为什么你的技能清单写了等于白写我见过太多人在简历、项目复盘或个人主页里放一大串技能关键词,从 Python、Excel、项目管理一路写到沟通能力、团队协作,看着挺全,真到面试官追问"你的 Python 到底做到什么…

2026/10/21 6:15:31 阅读更多 →
AHP层次分析法从原理到实战:判断矩阵、权重计算与一致性检验全解析

AHP层次分析法从原理到实战:判断矩阵、权重计算与一致性检验全解析

这份学习笔记断断续续改了三版。第一次只是抄了公式,第二次照葫芦画瓢跑通了案例,第三次才算真正想明白:层次分析法(AHP)这套东西,表面上是在算权重,本质上是逼着你把脑子里那团模糊的“我觉得”…

2026/10/21 6:14:30 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →