Halcon基于形状的模板匹配:原理、参数调优与实战经验
做视觉项目这些年经常碰到有人问我Halcon 里做定位用哪个方法最稳我的回答往往不是特征点也不是深度学习而是那个看起来有点“老派”的——基于形状的模板识别。尤其当你面对的是低纹理的金属件、注塑件或者节拍要求特别高的产线基于形状的匹配依然是当前工业视觉里最可靠的定位方案之一。这篇博客就是围绕 Halcon 官方那个经典的 shape-based matching 案例展开把原理、实操、参数调优和踩坑经验一次讲透。不管你是刚接触 Halcon 的新手还是已经在用匹配但总感觉效果不够稳定的老手这篇文章都值得你花几分钟读完。1. 官方案例到底在帮我们解决什么问题1.1 为什么是“基于形状”而不是灰度和特征点Halcon 官方案例里有一类非常经典的例程通常叫create_shape_modelfind_shape_model它解决的核心问题是在一张搜索图像中找到已知目标的位置和旋转角度。这个目标在模板图像中先用区域框出来系统会把这个区域内的轮廓“形状”抽象成一个模板模型然后在运行时去搜索图中找相似形状。很多人会问能不能用基于灰度值的模板匹配能但灰度匹配对光照变化非常敏感。车间里灯光稍微闪一下、工件表面氧化色差不一致灰度匹配的分数直接崩掉。特征点匹配比如 SURF、ORB又依赖稳定的纹理特征一旦遇到表面光滑、没有螺丝孔、没有明显角点的零件特征点根本提取不出来。而基于形状的匹配只关注物体边缘梯度的方向和位置不关心像素的绝对灰度值所以它对光照变化宽容得多对低纹理物体也有效。这正是它在工业定位中“屹立不倒”的原因。1.2 官方案例的代码脉络官方示例一般会包含几个阶段读取模板图像、绘制 ROI、检查模板、创建形状模型、保存模型、读取搜索图像、查找模型、显示结果。逻辑看起来很简单但这里面每一行代码背后都有复杂的几何运算和参数策略。很多人直接把官方代码复制到自己的图像上跑发现效果不理想就觉得 Halcon 不行。其实不是软件不行而是你不理解这些参数为什么这么设。这篇博文的核心就是把这些“为什么”讲明白。2. 核心原理拆解形状匹配是怎么“认出”工件的2.1 从模板图像到轮廓描述子Halcon 创建形状模型时并不会保存整张模板图像的像素它只保存模板区域内所有边缘点的信息。具体来说它对模板图像计算梯度得到每个边缘位置上的梯度方向Vector Field然后在这些边缘点上采样组成一个轮廓描述子。你可以把它理解成把物体的“骨架轮廓”和每个轮廓点对应的梯度方向记录下来。这样做的好处非常明显匹配的时候算法不是比像素灰度而是比搜索图中对应位置的梯度方向和模板轮廓的梯度方向是否一致。只要边缘结构没变哪怕背景亮度、物体表面灰度发生变化匹配分数都能保持稳定。这也是“形状匹配”比较严谨的定义所在。2.2 金字塔搜索与评分机制所谓金字塔搜索就是先把原图缩小几层形成一组分辨率递减的图像。在最小分辨率下物体轮廓只是几十个像素的粗略形状算法先在这里粗找候选位置找到后逐层向上映射在更高分辨率下进一步确认和精修。为什么要这么做很简单为了速度。如果直接在原始分辨率上做全图滑动比对计算量是灾难性的。而金字塔搜索让匹配过程从“粗定位”到“精定位”计算量大幅下降。Halcon 的参数里有NumLevels金字塔层数就是控制这个搜索层级的。层数越多搜索越快但层数太多会把小细节也抹掉导致在低分辨率层找不到目标就是所谓“漏检”。评分机制则是用一个归一化的相关度量比较模板轮廓和搜索图像梯度方向的一致性。分数接近 1 表示非常相似接近 0 表示不相关。实际项目里分数能稳定在 0.8 以上基本就可以正常使用了。2.3 亚像素精度与位姿输出find_shape_model的输出除了行坐标、列坐标、角度还有分数。坐标和角度的分辨率通常不局限于整数像素Halcon 会通过插值方式在评分曲面上寻找峰值位置达到亚像素精度。这个精度对你后续做引导运动、坐标补偿非常关键。实际项目中稳定的亚像素定位精度可以达到 0.1 像素级别。但前提是图像质量好、物体没有剧烈遮挡、模板和搜索图像的比例一致。如果放大倍率变了那就是另一回事需要用create_scaled_shape_model或者归一化算法。3. 动手实操完整跑通一次形状匹配3.1 环境准备与模板图像要求开始之前确保你的 Halcon 环境可以是 HDevelop 或者基于其他编程语言的开发环境能正常读取相机或本地图片。模板图像的获取有几个硬性要求模板图像要清晰边缘锐利不能虚焦工件尽量放在接近现场搜索图像的位置和姿态减少不必要的搜索范围背景尽量单纯如果现场背景复杂模板区域要尽量紧贴工件轮廓避免把背景边缘也学进去照明方式尽量与后续运行时一致保持一致能降低调参难度这些要求看似简单但很多人载跟头就栽在模板图像上。比如用一束很强的点光源拍模板结果现场换成环形光源整个物体的阴影和反光区域全变了形状匹配就会不稳定。所以制作模板时最好用的是和现场一致的成像系统。3.2 创建模板的关键参数选择在 HDevelop 里创建形状模型的代码通常长这样* 读取模板图像 read_image (Image, template.png) * 交互式绘制一个区域框住目标 draw_region (ModelRegion, Image) * 把图像缩小到区域范围内作为模板图像 reduce_domain (Image, ModelRegion, TemplateImage) * 检查模板轮廓在不同金字塔层下的形状 inspect_shape_model (TemplateImage, ModelContours, NumLevels, 0) * 创建形状模型 create_shape_model (TemplateImage, auto, -10, 20, auto, auto, ignore_local_polarity, 5, 10, ModelID) * 保存模型 write_shape_model (ModelID, model.shm)inspect_shape_model这一步非常有用它会用图形化方式展示不同金字塔层级下模板轮廓的样子。如果发现最小的物体特征在某一层已经消失你就需要限制金字塔最大层数。create_shape_model的参数依次为模板图像、金字塔层数、角度起始、角度范围、角度步长、优化选项、极性选项、对比度阈值、最小对比度阈值、模型句柄。这里重点说一下几个关键项金字塔层数传auto时 Halcon 自动决定但有时候自动选择会偏激进比如把很细的零件结构抹没。我一般会先用inspect_shape_model观察再手动指定一个合适的层数比如 4 或 5。角度范围如果你的工件在搜索图中可能出现任意角度旋转就把起始角度设为0角度范围设为360。但如果现场有治具限制角度只会在正负 5 度内晃动那么角度范围设置成-10到20就完全足够搜索速度会快很多。极点性ignore_local_polarity意思是局部梯度的方向不强制一致。正常工件如果是暗背景亮物体用use_polarity更严格、更准但如果工件上既有凸起又有凹陷边缘梯度方向可能局部相反用ignore_local_polarity会更稳定。3.3 查找模型运行时最核心的一段调用模型创建好并保存正式使用时只需要读取并查找代码非常简洁read_shape_model (model.shm, ModelID) * 参数依次搜索图像、模型句柄、角度起始、角度范围、最小分数、匹配数量、最大重叠、优化方式、金字塔起始层、贪心程度、输出行列角、分数 find_shape_model (SearchImage, ModelID, 0, 360, 0.6, 1, 0.5, least_squares, 0, 0.9, Row, Column, Angle, Score)这段代码中最容易被忽略的是“角度起始和角度范围”必须与创建模型时的范围一致或者至少是创建范围的一个子集。如果创建时角度范围是0~360查找时范围写成-20~20运行会报错或直接匹配不出结果。最小分数的含义是只有相似度超过这个值的候选才被接受。设成0.6是偏宽松的实际项目里我会先用0.5调试看看输出分数大概在什么水平再往上收紧。最大重叠参数用于多目标匹配场景控制多个匹配结果之间的允许重叠度。优化方式通常用least_squares它会在找到粗略位置后用最小二乘方法对位置和角度做亚像素精修精度比穷举插值方式更高。金字塔起始层设为0表示直接在最精细层进行最终定位一般用于小尺寸模型大模型可以设置成2或3能省很多时间。最后一个参数0.9是贪心程度数值越大匹配越快但过大会降低灵敏度需要耐心调。4. 参数调优让匹配又快又准的几个关键点4.1 金字塔层数与运行时间的平衡很多初学者一看到金字塔层数能加快速度就盲目调大。层数越大底层图像越小匹配越快但前提是模板在低分辨率下仍然保留足够的辨识度。如果层数太大目标只在高层图像里变成一坨光斑轮廓细节全丢匹配分数会骤降。正确做法是用inspect_shape_model逐层查看轮廓找到那个“轮廓还保持基本形状”的最大层数。在项目调试阶段我会把金字塔层数固定为手动值然后不断降低层数测试是否能找回目标找到一个既保证匹配不失手又能满足节拍要求的“临界层数”。通常工业项目里 4~6 层是常见选择但如果你目标本身很小可能只能用到 2~3 层。4.2 最小分数与贪心因子的权衡MinScore是一个门槛。把它调低容易产生误检调高则可能漏检。这里有个经验现场环境的稳定性决定门槛高度。如果光照、位置、背景都很稳定MinScore完全可以设在0.85以上配合 0.9 左右的高贪心因子速度很快。如果环境不稳定或者目标偶尔被轻微遮挡MinScore宁可设低一些0.6~0.7等找到目标后再用其他逻辑比如最终坐标的连续性判断来排除噪声。Greediness贪心程度也不是越大越好。它代表的是搜索过程中近似剪枝的力度。设置成0.9时算法在金字塔低层可能跳过一些分数略低但最终尚可的位置这对绝大多数目标没问题但如果目标有轻微变形或覆盖建议降到0.7~0.8减少漏检概率。我个人的习惯顺序是先设定一个偏保守的贪心0.7保证能稳定匹配再逐步增加看运行时间能否明显下降。如果时间下降不多那就保持 0.7 不变。4.3 多模板与多模型策略实际工件往往不止一种姿态。比如一个连接器正面和反面形状完全不一样即使角度都类似用一个模型也很难兼顾。这时候有两种思路一是建立多个形状模型用find_shape_model依次查找或者用find_shape_models一次查找多个模型再通过分数和位置关系选择最合适的候选。二是把各种姿态的轮廓合并训练成一个模型但这通常并不可靠因为不同姿态的轮廓可能重叠冲突反倒降低匹配的唯一性。我更推荐“多个模型 结果仲裁”的方案。比如在一个手机零件定位项目里目标有两个镜像形态我就分别建了两个模型。查找时跑两遍find_shape_model得到两个候选集合再通过“是否在允许区域”“分数是否达标”“期望位置是否连续”等规则筛选最终结果。这个思路比想用一个模型解决所有姿态要稳妥得多。5. 常见问题与排查技巧实录5.1 匹配不上或误匹配怎么办这是出现频率最高的问题。如果你的模板轮廓看着挺明显但搜索图就是找不到按下面顺序排查先降低MinScore到 0.3看是否能找到。此时如果你能明显看到目标但分数只有 0.4 左右说明图像里存在大量的背景干扰模板轮廓不够“特异”或者模板区域包含了大量背景边缘。解决办法是精修模板区域让它尽量只包含目标本身。检查搜索图像的光照和焦点是否和模板差异巨大。如果是重新采集更一致的图像或者增加预处理。检查角度范围。如果模板创建时只设置-10~20搜索时工件转了 90 度当然找不到。还有一个容易忽略的因素图像尺寸或缩放比例。Halcon 的create_shape_model默认不支持缩放搜索图像如果被 resize 过匹配就会失败。要用create_scaled_shape_model或create_aniso_shape_model处理。误匹配找到一堆错误位置也很常见。通常是模板轮廓太简单比如一个圆形冲压件轮廓就是一个圆搜索图里到处都是圆形的孔洞算法根本分不清哪个是目标。解决办法可以引入目标内部的特征形状比如圆中间的凸台、缺口作为模型区域的一部分。如果内部区域没有特征那就只能结合位置约束和区域筛选来过滤候选。5.2 旋转和缩放变化工况怎么处理Halcon 的形状匹配原生支持平面内的旋转所以只要角度范围设置正确旋转不是问题。但如果目标在三维空间内有俯仰、倾斜形状看起来会发生透视变形那就不是简单的旋转而是仿射或透视变化。对于这种情况建议建立多角度模型比如每 10 度一个模板或者用create_planar_calib_deformable_model这类可变形匹配方案。缩放问题更常见。相机高度变化、镜头焦距变化、目标大小不同都会导致几何缩放。官方提供了两种模型create_scaled_shape_model等比缩放模型和create_aniso_shape_model非等比缩放模型。使用create_scaled_shape_model时除了常规参数外需要额外指定ScaleMin和ScaleMax缩放范围以及ScaleStep步长。缩放范围设得越大搜索时间越长所以尽量把缩放范围控制在实际生产波动范围内。比如已知产品尺寸公差 ±5%就设置成0.95~1.05完全足够。5.3 光照变化会不会影响形状匹配很多人认为形状匹配完全不受光照影响这是误解。它确实比灰度匹配抗光照但极端光照变化依然会改变边缘位置。最典型的例子是强光引起的过曝物体边缘的梯度方向会发生奇变原本清晰的轮廓线过曝后变成一片白色梯度消失匹配分数自然下降。另一个常见问题是反光金属表面出现高光斑会在物体表面形成虚假的“暗色边缘”干扰匹配结果。对于这类情况我的经验是先保证相机采集图像时不发生过曝和严重的镜面反射实在不行在匹配前给图像做一次高斯滤波或中值滤波把细小的高光噪点抹掉。如果光照变化是缓慢的亮度变化一般不需要处理如果是突然改变方向产生的阴影就需要增加遮光措施而不是死磕算法。5.4 巧用“最小对比度”屏蔽弱边缘干扰create_shape_model里有一个参数叫MinContrast很多人直接忽略。它的作用是在模板学习时忽略对比度低于阈值的边缘点在运行时也忽略搜索图像中对比度低于阈值的边缘点。这个参数设置得合适可以有效屏蔽背景纹理和轻微反光产生的弱边缘只保留真正的物体轮廓。调试方法很简单先把MinContrast设成 0生成一个模型在调试窗口里查看模型轮廓。如果轮廓旁边多出很多细小的杂线说明背景弱边缘被学进去了。此时逐步提高MinContrast直到模型轮廓只包含主要目标轮廓为止。不过要小心如果目标本身边缘对比度也不高MinContrast设太高会直接把目标边缘也屏蔽掉。通常我会取目标边缘灰度值的十分之一到五分之一作为初始值。6. 经验总结与扩展建议聊到这里Halcon 官方案例里的“基于形状的模板识别”已经不再是黑盒子了。总结一下我个人在实际项目里的几点体会。第一官方案例最大的价值是帮你建立完整的代码骨架但真正能落地的系统必然要你对图像采集、模板制作、参数调优都有把控。模板不是随便框一个区域就完事它需要反复迭代验证。第二调参顺序要讲究。我会先调整金字塔层数和角度范围让匹配能稳定找到目标再调整MinScore和Greediness追求速度和稳定性平衡最后调MinContrast排除背景干扰。别一上来就同时调所有参数不然一个问题混着几个变量根本没法定位原因。另外形状匹配用熟了之后可以和很多视觉工具组合出更强方案。比如用形状匹配定位后把得到的旋转角度传给后续的测量算子对目标做精确测量也可以和 OCR 字符识别配合先定位再读取还可以做一个简单的“有无检测”在固定工位拍照模板匹配分数低于某阈值就报警这种场景在很多装配防呆里非常实用。如果你正在调试 Halcon 官方案例却总是不顺不要急着否定这个方法。多数时候不是形状匹配不行而是你的模板、光源、参数三者之间没有对齐。把底层逻辑吃透再回到代码上去看你会发现那些原本看不懂的参数其实每个都对应一个非常具体的物理现象。这就是视觉工程师成长最快的路径从“抄代码”到“懂代码”再到“设计代码”。希望这篇基于官方案例的拆解能帮你把那一步迈过去。

相关新闻

基于PSO的LLC变换器PI参数自动寻优MATLAB仿真项目解析

基于PSO的LLC变换器PI参数自动寻优MATLAB仿真项目解析

简介:本资源为基于MATLAB的PSO-PID控制器参数优化实现工程,面向控制工程初学者、自动化专业学生及需要摆脱人工试凑整定PID参数的开发人员。压缩包内共3个文件,其中2个m脚本分别实现粒子群优化主程序与PID参数求解逻辑,1个mdl模型…

2026/10/19 3:14:03 阅读更多 →
SenseNova-U1.5-8B-MoT-pose-bf16完全介绍:跑在Apple Silicon上的开源AI姿态迁移模型是什么

SenseNova-U1.5-8B-MoT-pose-bf16完全介绍:跑在Apple Silicon上的开源AI姿态迁移模型是什么

【免费下载链接】SenseNova-U1.5-8B-MoT-pose-bf16 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/SenseNova-U1.5-8B-MoT-pose-bf16 点击查看 免费下载 SenseNova-U1.5-8B-MoT-pose-bf16 是一款跑在 Apple Silicon(M 系列芯片&#xff0…

2026/10/19 3:14:03 阅读更多 →
AI可复现性挑战:固定随机种子、锁定环境,让训练结果稳定复现

AI可复现性挑战:固定随机种子、锁定环境,让训练结果稳定复现

1. 从一次“幽灵复现失败”说起:到底什么是AI的可复现性挑战前阵子我把一台GPU服务器上的旧训练任务重新跑了一遍,用的确实是当时的代码、当时的数据文件、当时的依赖环境,结果AUC从0.713变成了0.704。当时我的第一反应不是“代码写错了”&am…

2026/10/19 3:13:03 阅读更多 →

最新新闻

Autoware.Universe高精地图路径硬约束解析:为何必须用~/autoware-map

Autoware.Universe高精地图路径硬约束解析:为何必须用~/autoware-map

简介:本资源是面向自动驾驶开发者与ROS2初学者的Autoware.Universe环境验证实践包,聚焦高精地图部署这一关键前置环节,解决安装后‘能否跑通样例’的核心验证问题。压缩包为15.15MB的zip文件,共含4个核心文件:2个yaml配…

2026/10/19 4:03:30 阅读更多 →
开放式代码评审:从GitLab自动化到团队协作文化

开放式代码评审:从GitLab自动化到团队协作文化

"open-code-review"这个标题,一看就不是那种开箱即用的"xx管理平台",而是一套关于代码评审的工程实践思路。我在团队里折腾了大半年,从最初的"谁爱审谁审"到后来形成一套可量化的开放评审机制,中间…

2026/10/19 4:03:30 阅读更多 →
Claude Skills完全指南:从SKILL.md结构到文档、代码、创意技能实战

Claude Skills完全指南:从SKILL.md结构到文档、代码、创意技能实战

写程序写得年头久了,都会积攒下一套自己的“工作定式”:代码怎么排版、注释写到什么程度、周报按什么结构写、需求文档分几个章节。这些经验以前只能靠复制粘贴旧文档来延续,直到我完整梳理了一遍Claude官方Skills仓库之后,才意识…

2026/10/19 4:03:30 阅读更多 →
代码审查自动化实践:从形式主义到真香流程的落地指南

代码审查自动化实践:从形式主义到真香流程的落地指南

1. 为什么我把代码审查从"形式主义"做成了"真香流程"先说一个我观察到的现象:大多数团队聊起代码审查,嘴上都说重要,实际上过得去就行。PR挂了两天没人理,reviewer随便点个"看起来没问题"就合入&am…

2026/10/19 4:03:30 阅读更多 →
在数据处理与分析领域,SQL(Structured Query Language)和 Python 是两种最核心的工具

在数据处理与分析领域,SQL(Structured Query Language)和 Python 是两种最核心的工具

在数据处理与分析领域,SQL(Structured Query Language)和 Python 是两种最核心的工具。SQL 是用于管理和操作关系型数据库的领域专用语言,而 Python 是一种通用编程语言,凭借丰富的生态库(如 Pandas、NumPy…

2026/10/19 4:03:30 阅读更多 →
用元技能优化所有Skill:autoresearch的Prompt工程实践

用元技能优化所有Skill:autoresearch的Prompt工程实践

写一个 Skill 来优化所有 Skill —— autoresearch 的 Prompt 工程实践我最近一直在折腾 AI Agent 的自定义 Skill,前后写了十几个,用来处理不同场景的文本、做资料梳理、调格式。写多了以后发现一个问题:每次新写一个 Skill,都被…

2026/10/19 4:02:29 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于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/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/18 12:16:16 阅读更多 →