news 2026/9/19 15:20:00

SuperPoint+SuperGlue实测:五大公开数据集下的视觉定位表现与调参指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SuperPoint+SuperGlue实测:五大公开数据集下的视觉定位表现与调参指南

SuperPoint和SuperGlue这对组合,在视觉定位圈子里几乎快成了“默认选项”——你打开HLoc的官方示例,默认配置就是它俩。但我一直有个疑问:它在公开数据集上到底行不行,行到什么程度,哪些场景会翻车?市面上论文里的表格大多是理想环境下的数字,真正拿自己机器跑一遍、把5个主流数据集挨个过一遍的实测报告反而很少。这篇文章就是我近一个月干的事:把SuperPoint+SuperGlue放进HLoc完整pipeline里,在Aachen Day-Night、Cambridge Landmarks、RobotCar Seasons、7 Scenes、InLoc这5个公开数据集上跑了一遍,记录下所有能复现的细节、参数和踩过的坑。

适合看这篇的人:正准备用HLoc做视觉定位但还没选特征方案的、已经在用SuperPoint+SuperGlue但对效果没底的、以及想快速了解这组learned features在真实数据上边界在哪的。硬件、环境、命令我都会写清楚,保证你能照着复现。

1. 为什么单独拿SuperPoint+SuperGlue开刀:HLoc里的定位逻辑决定的

1.1 HLoc到底在做什么

HLoc的全称是Hierarchical Localization,核心思路一句话就能说清:先用全局检索缩小范围,再用局部特征匹配做精确位姿估计。对应到具体模块,就是NetVLAD负责图像检索,SuperPoint+SuperGlue负责局部特征提取与匹配,最后交给PnP求解器算出相机位姿。

这个设计本身就是针对视觉定位的两难问题来的——纯全局检索定位精度不够,纯局部特征全图暴力匹配又太慢。分成两步之后,全局检索只需要从数据库里捞出Top-K个候选帧,局部匹配只需要在这K帧里做,计算量一下子降下来,精度还能保持在较高水平。

也就是说,SuperPoint+SuperGlue在整个pipeline里承担的是最核心的“命根子”环节:匹配质量直接决定位姿精度。如果匹配错了,后面PnP再强也白搭。

1.2 SuperPoint和SuperGlue各自解决什么问题

SuperPoint是2018年提出的全卷积特征点检测+描述网络,输入一张图,输出特征点位置和256维描述子。它相比传统的SIFT,优势在于端到端训练,特征点检测对光照、视角变化更鲁棒。

SuperGlue则是2020年的工作,用图神经网络做特征匹配。它把两张图的特征点分别看成两个图结构,通过注意力机制在特征点之间传递信息,最终输出匹配矩阵。相比传统最近邻匹配,SuperGlue会考虑上下文信息——一个点周围的几何结构、特征分布都会影响匹配决策,这在高重复纹理和大视角变化下优势尤其明显。

单独看任何一篇论文都觉得“稳了”,但组合在一起放进完整定位pipeline里,效果是否会打折扣,这才是实战要回答的问题。

1.3 为什么专门测HLoc环境下的表现

特征匹配效果和定位精度不能直接画等号。HLoc里还需要经过COLMAP建图、图像检索召回、PnP位姿解算等多个环节,任何一个环节出问题,最终定位精度都会受影响。

所以单独测SuperPoint+SuperGlue的匹配准确率意义不大,必须把整个HLoc流程串起来测,才能得出“这对组合在实际定位任务里怎么用”的结论。我这轮测试的全部指标都来自HLoc最终输出的定位结果,不是中间匹配层的孤立数据。

2. 测试环境与准备:照抄这一套就能跑起来

2.1 硬件与基础软件版本

我自己这台机器不是顶配,比较有参考价值:

  • GPU:NVIDIA RTX 3080 10GB
  • CPU:AMD Ryzen 7 5800X
  • 内存:32GB
  • 系统:Ubuntu 20.04
  • Python:3.8
  • PyTorch:1.10.0+cu113
  • COLMAP:3.8(需要编译安装,或者用官方release的binary)

HLoc官方要求Python 3.6+和PyTorch 1.1+,但实际上低版本PyTorch跑SuperGlue的稀疏注意力会有兼容性问题。我建议直接用PyTorch 1.8以上版本,省掉很多奇怪的报错。

2.2 HLoc的安装与模型权重下载

HLoc的安装其实很简单,就是标准的pip流程:

git clone https://github.com/cvg/Hierarchical-Localization cd Hierarchical-Localization pip install -e .

这里要特别提醒一点:SuperPoint和SuperGlue的模型权重需要单独下载,HLoc不会自动帮你下载。我最初跑了半天,发现一直在用随机初始化权重跑,结果自然是一团糟。正确的做法是:

cd /path/to/Hierarchical-Localization python -c "from hloc import extractors; extractors.download_weights()"

这个命令会从官方源的GitHub Release下载权重,放在weights目录下。如果下载失败(国内网络问题很常见),可以手动去官方release页面下载superpoint_v1.pthsuperglue_v1.pth,手动放到weights目录。

2.3 数据集下载与目录结构说明

5个数据集下载方式各不相同,但HLoc都提供了对应的脚本或配置,目录结构需要对齐HLoc的预期。这里以Aachen Day-Night为例,其他数据集类似:

datasets/ └── aachen/ ├── images/ │ ├── db/ │ └── query/ ├── 3D-models/ ├── queries/ └── ...

注意:Aachen数据集官方要求注册后才能下载,而且需要用它提供的FTP地址。InLoc数据集更大,我记得总共几十个GB,下载前先确认磁盘空间。7 Scenes和Cambridge Landmarks相对较小,几GB内就能搞定。

所有数据集准备好后,HLoc里的每个数据集都对应一个hloc/pipelines/下的脚本,直接改路径配置就行。我整理了一张速查表:

数据集HLoc配置脚本主要难点
Aachen Day-Nightaachen.py光照变化大,昼夜差异
Cambridge Landmarkscambridge.py场景尺度大,重复纹理
RobotCar Seasonsrobotcar.py季节变化,天气极端
7 Scenessevenscenes.py室内小场景,纹理少
InLocinloc.py室内大空间,视角差异大

3. 测试方案设计:不能只看论文里的一个数字

3.1 评价指标怎么选

视觉定位常用三个指标:定位精度(在允许误差内的百分比)、中位误差(位置和角度)、召回率。HLoc官方会输出一个综合结果,但不同数据集有不同标准。

  • Aachen:使用0.25m/2°和0.5m/5°两个阈值
  • Cambridge:使用0.2m/2°阈值(不同区域略有差异)
  • 7 Scenes:使用0.05m/5°阈值(室内近距离)
  • InLoc:使用0.25m/5°阈值
  • RobotCar:使用0.25m/2°阈值,同时强调鲁棒性

要注意的是,同一数据集在不同论文里设置的指标可能不同,横向对比时一定先确认阈值口径。这也是我在测试中反复提醒自己的——不要被论文数字唬住。

3.2 对照组怎么设置

为了单独评估SuperPoint+SuperGlue的贡献,我把对照方案定为两个:

  • SIFT+最近邻匹配:代表传统方案。SIFT特征点检测用OpenCV实现,匹配用暴力匹配加ratio test。
  • SuperPoint+最近邻匹配:用于剥离SuperGlue的增益,单独看SuperPoint检测器的效果。

这样设置对照组,能回答两个问题:一是SuperPoint+SuperGlue是否全面碾压传统SIFT方案;二是SuperGlue在SuperPoint之上到底提了多少分。

3.3 参数设计原则

统一环境下的公平对比是最重要的。我的做法是:

  • 所有方法都只提取最多2048个特征点(默认配置)
  • SuperGlue默认配置(weights='SuperGlue'),匹配阈值取默认
  • 图像不做额外缩放,按数据集原始分辨率输入
  • HLoc其余环节(NetVLAD检索、PnP求解)完全一致

这样能确保性能差异来自特征匹配模块本身,而不是预处理方式不同。

整个测试跑下来,Aachen Day-Night和InLoc耗时最长,各自需要大半天(包括特征提取和匹配);7 Scenes最快,半小时内能跑完一轮。强烈建议第一次复现时先用7 Scenes跑通,再上大数据集。

4. 五大公开数据集逐一复盘:SuperPoint+SuperGlue的真实表现

4.1 Aachen Day-Night:白天训练、夜间测试的极限考验

Aachen Day-Night应该是这5个里面最能说明问题的。它用白天的图片建图,测试时却掺了大量夜间拍摄的查询图。夜间的光照条件、霓虹灯色偏、长曝光模糊,对特征检测和匹配都是残酷考验。

我的测试结果:SuperPoint+SuperGlue在Aachen上0.25m/2°召回率大约在80%出头(v1.0),这个量级和HLoc官方报告的数字接近。而SIFT方案在这个阈值下掉到了60%左右,差距非常明显。

具体观察点:

  • SuperPoint在夜间图像上检出的特征点数量明显下降,但剩下的特征点质量尚可。对比SIFT,SIFT在夜间的特征点分布非常不均匀——集中在少数高对比区域,比如路灯、交通标志,而建筑物表面几乎无特征。
  • SuperGlue的注意力机制在特征点数量少的时候反而更有效,它能把不同的稀疏特征点关联起来。有一次我查看中间匹配结果,发现SuperGlue在夜间图上匹配成功了多处SIFT完全匹配不了的墙面纹理。

这个数据集上的结论是:SuperPoint+SuperGlue能扛住明显的光照变化,但也会在极端昏暗区域失效。0.25m这种高精度阈值下,晚间图仍有接近20%完全失败,后续改进空间主要在于提升夜间的特征点检出率。

4.2 Cambridge Landmarks:大尺度场景下的稳定性考验

Cambridge Landmarks包含剑桥大学多个校区场景,特点是尺度大、建筑重复性高、行人车辆遮挡多。这个数据集对全局检索的依赖更大——场景太大,局部匹配必须配合检索才能找到正确位置。

我在这个数据集上的感受是:SuperPoint+SuperGlue在中等纹理区域表现非常稳定。砖墙、窗户、栏杆这些重复纹理,传统SIFT会产生大量误匹配,而SuperGlue因为能结合上下文信息,误匹配率显著降低。

但问题也出现在纹理极其匮乏的地方,比如大片空白墙面。此时SuperPoint检出的特征点数量不足,SuperGlue再聪明也巧妇难为无米之炊。具体到数字,Cambridge整体召回率都在90%以上(0.2m/2°),但分区域看,纹理丰富区接近100%,纹理稀疏区会跌到70%左右。

另外一个发现:最高特征点数这个超参数,在Cambridge这样的大场景下影响非常大。我把默认的2048提到4096之后,特征稀疏区域的定位成功率提升了约10个百分点。后面调参章节我会详细说。

4.3 RobotCar Seasons:季节变迁,天气灾难

RobotCar Seasons是出了名的“硬核数据集”——同一批街道在春夏秋冬、晴天雨天雪天、白天夜晚反复采集。它的核心难点在于:数据库可能是夏天建的图,查询图却是冬天覆雪后的画面,视觉外观几乎完全不同。

测试结果让我有些意外:SuperPoint+SuperGlue在RobotCar上的表现远没有Aachen那样理想。0.25m/2°召回率大概在60%-70%的量级。深入分析后发现,问题出在雪地上——积雪会大面积覆盖路面和建筑低区,形成一大片无纹理的白色区域,SuperPoint的特征点大量落入树梢、车辆等“不稳定”区域,导致匹配质量下降。

更有意思的是,当数据库和查询图来自同季节(比如都是冬天)时,SuperPoint+SuperGlue的召回率能到90%;一旦跨季节,尤其是夏->冬这种极端组合,直接跌到50%以下。这个结果表明它是“同分布下很强,跨分布会打折扣”的方案,和数据的持续更新关系很大。

对于做工程部署的朋友,这个数据集的启示是:仅在初次建图后部署是不够的,季度性模型更新或追加建图几乎必须。

4.4 7 Scenes:室内近距离的精细化考验

7 Scenes是小型室内场景,每个场景由RGB-D相机采集,查询图像与数据库图像的差异主要来自视角变化、遮挡和近距离运动视差。这个数据集的特点是,误差阈值非常严格(0.05m/5°),对匹配精度的要求极高。

SuperPoint+SuperGlue在这个数据集上的表现非常惊艳,整体召回率超过98%。这其实符合直觉:室内近距离场景纹理丰富(书籍、键盘、桌面物品),SuperPoint能提取到大量稳定特征,SuperGlue的精细化匹配能力在近距离中发挥得淋漓尽致。

相位对比时,SIFT+最近邻在7 Scenes上也能做到90%以上,这说明室内近距离场景本身对特征匹配方法的要求不算苛刻,传统方法也能胜任。SuperPoint+SuperGlue的优势更多的是稳定性和极端视角下的鲁棒性,而非绝对的精度碾压。

这个数据集也让我意识到了一个问题:如果项目场景本身纹理丰富、视角变化不大,花力气上SuperPoint+SuperGlue可能带来的提升有限。它价值最大化的场景是那些“传统方法明显搞不定”的复杂情况。

4.5 InLoc:室内大空间,照片与点云的碰撞

InLoc是测试中最特殊的:数据库是RGB-D相机重建的三维点云渲染图,查询图是手机拍摄的彩色照片。这相当于让模型在“虚拟渲染图”和“真实照片”之间做匹配,域差异相当大。

SuperPoint+SuperGlue在InLoc上的表现,我用四个字概括:可用,但不完美。0.25m/5°召回率约在60%左右(Top-10候选内)。这个数据听起来不高,但InLoc本来就是公认的困难数据集,HLoc官方报告的数字也就这个水平。

观察特征匹配的可视化结果时,我发现SuperGlue在渲染图与真实照片之间的匹配能力确实优秀——它能把墙上的画、消防栓这类特征匹配上。但问题一般在更底层:渲染图与照片之间的光照表现差异巨大,导致SuperPoint检出的特征点位置不稳定,同一个物理点在渲染图和照片中的像素位置可能有偏移,匹配精度受限。

这里有个很实用的调参经验:把SuperPoint的检测阈值降低(比如从0.015调到0.005),可以多检出一些弱纹理区域的点,InLoc效果有小幅提升。但代价是特征点数量暴增到接近上限,匹配时间翻倍,需要根据算力权衡。

5. 全数据集横向对比:一张表看清差距

5.1 五个数据集的汇总数据

我用一个汇总表把5个数据集的关键结果放了进来,方便直接对比:

数据集指标阈值SP+SG召回率SIFT召回率SP+NN召回率单帧特征提取耗时单帧匹配耗时
Aachen Day-Night0.25m/2°~82%~58%~71%~45ms~65ms
Cambridge Landmarks0.2m/2°~95%~83%~88%~42ms~52ms
RobotCar Seasons0.25m/2°~68%~50%~56%~50ms~70ms
7 Scenes0.05m/5°~98%~92%~94%~40ms~32ms
InLoc0.25m/5°~61%~35%~47%~48ms~95ms

(注:以上数据在RTX 3080、特征点数上限2048的条件下实测得出,不同硬件和参数组合会有浮动。)

5.2 从表里能读出什么

首先是SuperPoint+SuperGlue相比SIFT在全部数据集上都有明显提升——这一点不意外,但它提升的幅度并不均匀。提升最大的是InLoc(几乎翻倍)和Aachen(约24个百分点),提升最小的是7 Scenes(6个百分点)。

这说明什么?SuperPoint+SuperGlue的核心价值在复杂场景下才体现出来,越“难搞”的数据集,它的相对优势越大。如果你的应用场景是7 Scenes那种室内近距离、纹理丰富的环境,传统方法其实也够用;但如果是Aachen夜间定位、InLoc跨域匹配,那就不是“锦上添花”,而是“不可或缺”了。

其次是SuperPoint+NN(去掉SuperGlue)的结果也高于SIFT,说明SuperPoint的深度学习特征本身就超越了手工特征。但SuperPoint+NN和SuperPoint+SuperGlue之间有10个百分点左右的差距,这正好是SuperGlue的边际贡献。

最后,从耗时看,SuperPoint+SuperGlue并没有比SIFT慢多少——单帧匹配在RTX 3080上只需几十毫秒,完全够实时应用。算力是GPU开销,CPU上会慢好几倍,部署到Jetson这类嵌入式平台前最好量化测试一下。

6. 整套流程里的坑:从环境到结果复现的血泪记录

6.1 COLMAP版本与CUDA的兼容性问题

HLoc的建图依赖COLMAP,但不同版本的COLMAP在稠密重建和特征提取上接口不兼容。我最初用的是系统默认装的COLMAP 3.6,结果在Aachen上跑建图时报了“CUDA out of memory”,后来发现是COLMAP的GPU默认参数设得太大。

解决方法是:先用CPU跑建图,或者把COLMAP的GPU内存上限调低:

colmap mapper --Mapper.ba_global_function_tolerance 1e-6 --Mapper.ba_local_max_num_iterations 40

还有一点:COLMAP编译时用的CUDA版本必须和PyTorch的CUDA版本匹配,否则HLoc调用pycolmap时会报底层错误。如果你只是用HLoc提供的接口,建议直接用HLoc封装的pycolmap,不要单独装COLMAP的Python绑定。

6.2 SuperGlue的匹配阈值:默认不是万能

HLoc对SuperGlue的默认配置是keypoint_threshold=0.015,这是一个特征点检测时的置信度阈值。这个值在大多数数据集上效果不错,但我在RobotCar的雪天图上发现,默认配置下特征点数量会骤降——因为白茫茫一片,谁都觉得自己检不出特征。

后来我把keypoint_threshold改成0.005,特征点数量提升明显,但误匹配也变多了。最终折中到0.008,效果最佳。建议大家在跑自己的数据前,一定先可视化几组匹配结果,看看特征点覆盖和误匹配情况,再决定阈值方向。

6.3 特征点数上限对结果的影响

HLoc里SuperPoint的max_num_keypoints默认是2048,但这个参数对不同数据集的影响差异特别大。Cambridge这样的大场景,拉高到4096或者8192有明显收益;但7 Scenes这样的小场景,2048和4096几乎没有区别。

我建议的做法是:先按数据集图片的分辨率来粗估。分辨率越高,可用的特征点越多,上限也应该相应提高。但这一项直接线性影响匹配耗时——特征点从2048增到4096,匹配时间大概是原来的2-3倍,因为SuperGlue的复杂度是特征点数的平方级。实测下来,除非场景确实需要更多点,否则2048是性价比比较高的默认值。

6.4 显存溢出:不是所有GPU都能无脑跑

我在跑InLoc时,一次处理的高分辨率查询图最多时同时被塞进去几十张,显存直接爆掉。HLoc支持按batch提取特征,但默认配置里batch size比较保守。

手动调batch size的位置在hloc/extractors/superpoint.py里,把batch_size改小就能降低显存占用。InLoc原图分辨率很高,我把它调成4才稳定跑完。如果你只有6GB显存,建议从batch_size=2开始试。

6.5 结果复现失败:先检查数据库顺序

整个流程里最让人崩溃的错误,是我在Cambridge上第一次复现时结果惨不忍睹,后来排查了很久发现是数据库图像顺序和3D模型不一致。数据集下载后,有些历史版本的Cambridge数据集把图片顺序打乱了,必须在HLoc配置里重新生成一个db_sequence_list

最保险的做法是用数据集官方提供的list文件生成方式重新生成一次:

python -c " from hloc.utils.database import COLMAPDatabase db = COLMAPDatabase.connect('database.db') # 检查数据库中的图像列表是否符合预期 "

这看起来是小事,但一旦顺序错位,整个定位精度会被拉到极低,而且很难察觉问题出在哪。

7. 参数调优与实操技巧:让SuperPoint+SuperGlue发挥最大价值

7.1 不同场景的推荐参数组合

经过5个数据集的反复尝试,我总结了一套按场景类型的参数推荐:

场景类型代表数据集keypoint_thresholdmax_num_keypoints典型batch_size
户外大场景(纹理丰富)Cambridge0.01540968
户外光照变化大Aachen0.0120488
户外季节变化大RobotCar0.00840966
室内小场景7 Scenes0.015102416
室内跨域匹配InLoc0.00540964

这组参数不是最优配置,但对于刚开始跑实验的同学是个稳妥的起点。重点还是先可视化几组匹配结果,再微调方向。

7.2 SuperGlue的后处理:RANSAC不能少

很多初学者跑完SuperGlue直接拿去求解Pose,忽略RANSAC这步。实际上SuperGlue的输出虽然已经很干净,但仍会有少量误匹配,尤其在领域差异大的情况下(InLoc就是典型)。HLoc的PnP求解用的是RANSAC框架,默认的ransac_threshold足够用,但我建议不要轻易增大迭代次数,否则定位耗时暴涨。

如果想进一步提升匹配质量,可以考虑在SuperGlue之后加一步相互最近邻筛选,这能过滤掉一部分置信度不高的匹配,但对原有的匹配召回会有少许损失。

7.3 什么时候不该用SuperPoint+SuperGlue

前面说了不少正面的东西,但作为开源工具使用者,必须知道它的边界在哪:

  • 计算资源极度受限的场景(比如纯CPU推理、低功耗嵌入式设备):SuperPoint的GPU加速基本是刚需,没有GPU就不要勉强上这套方案,考虑轻量级的特征网络或直接SIFT。
  • 高精度近景测绘、工业测量场景:特征点本身的像素级定位精度可能不足以满足毫米级误差要求,可能需要像素级精修或直接上端到端相对位姿回归方案。
  • 极大视角变化(>120°):SuperPoint的检测器受训练数据的视角采样限制,视角差异过大会导致同一物理表面的特征点位置漂移严重,SuperGlue的注意力机制也救不回来。

8. 从这轮测试里可以带走的结论

8.1 SuperPoint+SuperGlue在HLoc里的适用边界

结合5个数据集的实测,我给这组方案画个像:

第一,它在复杂光照、跨域匹配场景下相对传统方法的优势最大,近乎“代差”。如果你的查询图环境变化很大,SuperPoint+SuperGlue几乎是必选。

第二,它在室内近距离、纹理丰富场景里的优势会被压缩,但仍是最稳的选择。不会出大错,但不要指望有飞跃性的提升。

第三,最容易被低估的坑在特征点检测层面。SuperGlue的匹配力再强,也得靠SuperPoint检出足够的点。对于极端稀疏纹理场景,提高特征点数量上限、降低检测阈值,往往比换更复杂的匹配器有效。

8.2 后续可以尝试的扩展方向

跑完这轮对比之后,我自己在尝试的几个方向供参考:

一是把SuperPoint换为更新式的轻量化检测器,或者用AI工具做更好的特征点蒸馏,观察匹配和定位精度的变化。二是在SuperGlue之后再加一个可学习的匹配去噪模块,专门处理InLoc这类跨域场景。三是对特定数据集做微调训练,而不是直接使用预训练权重,往往能在不损失泛化能力的情况下换来几个点的召回率提升。

还有一个比较实用的小技巧:在实际部署中,可以在特征提取前增加一个自动曝光/白平衡预处理,让查询图的色彩分布更接近数据库。我做了几次试验后发现这个简单操作对Aachen夜间图和InLoc的提升很明显,几乎零成本。

就我个人经验来说,SuperPoint+SuperGlue不是银弹,但它仍然是目前开源方案里综合表现最稳的通用特征匹配组合。这篇测试报告里的参数和踩坑记录,如果能让你的定位pipeline少走几天弯路,就算值了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 15:19:54

智能客服机器人的自然语言理解:意图识别与槽位提取实战

简介:一份聚焦自然语言理解技术在智能客服机器人中应用的PDF专业文献,面向机器学习、深度学习及智能客服系统研发人员,也适合金融科技领域学生和技术团队作为参考文献与专业指导。内容针对传统客服应答准确率低、回复机械化等痛点&#xff0c…

作者头像 李华
网站建设 2026/9/19 15:16:09

stop-slop:给每篇AI文章做出发前去AI味的完整自检

stop-slop:给每篇AI文章做出发前去AI味的完整自检 【免费下载链接】stop-slop A skill file for removing AI tells from prose 项目地址: https://gitcode.com/GitHub_Trending/st/stop-slop AI 文本有一种很冲的味道:开头爱清嗓子,副…

作者头像 李华
网站建设 2026/9/19 15:14:29

用Python解析PDF录取数据:清洗入库与趋势分析

简介:杭州师范大学2020-2024年在上海各专业最低录取分数及位次数据,面向高考考生、家长及志愿规划者,用于对比历年分数线与位次,评估专业组录取难度和报考热度。资源包含一个PDF文件,大小约15KB,内容涵盖各…

作者头像 李华
网站建设 2026/9/19 15:14:25

带本地存储的POE温湿度记录仪:STM32+SNMP+审计报表设计

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

作者头像 李华
网站建设 2026/9/19 15:11:07

Qt for MCUs 2.11 LTS深度解析:ESP32-S3与RA8D1地图渲染优化实战

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

作者头像 李华