news 2026/9/21 1:30:52

Windows平台COLMAP三维重建实战:CUDA配置与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows平台COLMAP三维重建实战:CUDA配置与避坑指南

1. 为什么要在Windows上折腾COLMAP

如果你手里有一堆同一场景的照片,想从这些二维图像里恢复出三维结构,COLMAP几乎是绕不开的工具。它把**运动恢复结构(SfM)多视图立体(MVS)**两套流程整合在一起,输入一组照片,输出稀疏点云、相机位姿,再进一步生成稠密点云和网格模型。做文物数字化、建筑测绘、游戏资产扫描、甚至电商商品的三维展示,都能用得上。

但问题在于,COLMAP的官方文档和社区教程绝大多数以Linux为默认环境,Windows用户照着做经常卡在第一步。我自己第一次在Windows上跑COLMAP,光是CUDA和显卡驱动的版本匹配就耗掉了一个下午,后来又遇到路径含中文导致读取失败、显存不足直接崩溃、稠密重建跑了一半进程消失等问题。这些坑在Linux上要么不存在,要么有现成的解决方案,但在Windows上你得自己一个个趟。

这篇内容面向的是在Windows平台上从零开始使用COLMAP做三维重建的从业者和爱好者。不管你是刚接触三维重建的新手,还是从Linux迁移过来需要适配Windows环境的老手,我都会把从环境准备到最终出模型的完整链路拆开讲清楚,重点放在那些官方文档不会告诉你、但实际一定会遇到的坑上。核心关键词包括COLMAP、Windows、三维重建、CUDA、避坑,这些会贯穿全文。

需要提前说明的是,三维重建本身是一个计算密集型任务,对硬件有实打实的要求。如果你的机器没有独立显卡,或者显卡显存小于4GB,稠密重建这一步基本跑不动,这不是软件配置能解决的问题。下面的内容默认你有一块支持CUDA的NVIDIA显卡,显存6GB以上会比较从容。

2. 环境准备:CUDA、显卡驱动与COLMAP的版本三角关系

2.1 先搞清楚COLMAP到底依赖什么

很多人一上来就去下载COLMAP的安装包,装完发现跑起来报错,提示找不到CUDA或者CUDA版本不匹配。这是因为COLMAP的Windows预编译版本在打包时已经链接了特定版本的CUDA运行时,你机器上的显卡驱动必须能支持这个CUDA版本,否则程序启动就会失败。

这里有一个容易被忽略的层级关系:显卡驱动版本决定了你最高能支持的CUDA版本,而COLMAP预编译包决定了它需要的最低CUDA版本。两者之间必须存在交集,否则就是死路。

举个例子,COLMAP 3.8的Windows CUDA版本通常基于CUDA 11.x构建,那么你的显卡驱动必须至少支持CUDA 11.0。如果你用的是很老的驱动,比如只支持到CUDA 10.2,那COLMAP的CUDA版本就跑不起来,只能退而求其次用无CUDA的版本,但那样稠密重建会慢到无法接受。

2.2 显卡驱动的检查与更新

在Windows上查看当前驱动支持的CUDA版本,最直接的方法是打开命令行,输入:

nvidia-smi

输出结果右上角会显示CUDA Version: XX.X,这个数字就是你当前驱动能支持的最高CUDA版本。注意,这是驱动支持的上限,不代表你系统里装了CUDA Toolkit。

如果这个版本号低于COLMAP要求的版本,你需要去NVIDIA官网下载新版驱动。这里有个经验:不要用Windows设备管理器自动更新显卡驱动,它给你装的往往是通用版或者很旧的版本,一定要去NVIDIA官网手动下载对应型号的驱动。下载时选择"Game Ready驱动"或"Studio驱动"都可以,Studio驱动对计算类任务的稳定性稍好一些,但差异不大。

安装驱动时建议选择"自定义安装",勾选"执行清洁安装",这样会清除旧驱动的残留配置,避免版本冲突。安装完成后重启,再次运行nvidia-smi确认版本号已经更新。

2.3 CUDA Toolkit要不要单独装

这是一个高频问题:COLMAP的预编译包已经自带了CUDA运行时,我还需要单独安装CUDA Toolkit吗?

答案是:如果你只用COLMAP的预编译版本,不需要单独安装CUDA Toolkit。预编译包里已经包含了运行所需的CUDA动态链接库。但如果你打算从源码编译COLMAP,或者需要用到COLMAP的Python绑定(pycolmap),那就需要安装完整的CUDA Toolkit,因为编译过程需要CUDA的编译器nvcc和开发头文件。

我个人的建议是:先用预编译版本跑通整个流程,确认硬件和驱动没问题之后,再考虑是否需要从源码编译。很多人一上来就折腾源码编译,结果卡在CMake配置阶段,连COLMAP的界面都没见到就放弃了。

如果你确实需要安装CUDA Toolkit,去NVIDIA官网的CUDA Toolkit归档页面下载。选择版本时注意:CUDA Toolkit的版本不能高于显卡驱动支持的版本。比如nvidia-smi显示支持CUDA 12.2,你可以装CUDA 12.2或更低版本,但不能装12.3。安装时选择"自定义",可以取消勾选GeForce Experience等无关组件,只保留CUDA核心组件。

2.4 COLMAP版本的选择

COLMAP的Windows版本在GitHub Releases页面提供下载,有带CUDA和不带CUDA两种。文件名里带cuda的就是GPU加速版本,不带的就是CPU版本。除非你的显卡不支持CUDA,否则一律选CUDA版本。

版本号方面,不建议追最新版。新版本可能引入了新的依赖或者改变了某些默认参数,而社区教程往往滞后。我实测下来,3.7和3.8这两个版本在Windows上最稳定,资料也最全。下载后解压到一个纯英文、无空格、路径尽量短的目录,比如D:\COLMAP。这一点后面还会展开讲,因为路径问题是Windows上COLMAP最常见的坑之一。

3. 第一次跑通:从照片到稀疏点云的完整操作链路

3.1 图像采集的硬性要求

在打开COLMAP之前,先检查你的照片是否满足重建的基本条件。这不是软件能弥补的,输入质量决定了输出质量的上限。

  • 重叠度:相邻照片之间至少要有60%以上的重叠区域,理想情况是70%-80%。拍的时候每走一步拍一张,不要跳着拍。
  • 数量:小物体(比如一个雕塑)至少30-50张,建筑立面至少100张以上,大场景可能需要几百张。
  • 光照:避免强烈的阴影变化和反光表面。光照不一致会导致特征匹配失败。
  • 焦距:同一组照片尽量用同一焦距拍摄,不要中途变焦。变焦会改变内参,增加重建难度。
  • 纹理:纯色墙面、玻璃、金属反光面是特征匹配的噩梦,尽量避开或者后期裁剪掉。

我踩过的一个坑是:用手机拍了一组照片,自动模式导致每张的曝光和白平衡都不一样,结果特征匹配阶段大量误匹配,稀疏点云一团糟。后来改成手动模式锁定曝光和白平衡,同样的场景重建质量提升非常明显。

3.2 新建项目与导入图像

打开COLMAP的图形界面,依次点击File -> New Project。在弹出的对话框里,有三个路径需要设置:

  • Database:这是COLMAP存储特征和匹配信息的SQLite数据库文件,新建一个空文件即可,比如D:\project\database.db
  • Images:选择存放照片的文件夹。
  • Output:选择输出稀疏重建结果的文件夹。

这里就是第一个大坑:所有路径必须全是英文,不能有中文、空格、特殊字符。COLMAP底层用的是C++的文件流操作,对非ASCII路径的支持很差。如果你的照片放在D:\我的项目\照片下面,大概率会在导入阶段就报错或者静默失败。养成习惯,从项目根目录开始就用英文命名。

设置好之后点击Save,然后File -> Import Images,COLMAP会读取所有照片并显示在界面左侧的列表里。

3.3 特征提取的参数取舍

点击Processing -> Feature Extraction,弹出特征提取的参数面板。这里有几个关键参数需要理解:

参数含义建议值
Camera model相机模型未知相机选SIMPLE_RADIAL
First camera初始相机编号默认1
Single camera是否单相机同一设备拍摄勾选
Peak threshold特征点阈值默认0.0067,纹理弱可降到0.004
Camera resolution图像分辨率默认-1使用原图

Camera model的选择很关键。如果你不知道相机的内参,选SIMPLE_RADIAL,它只估计一个径向畸变参数,适合大多数消费级相机和手机。如果你用的是鱼眼镜头,选OPENCV_FISHEYE。如果照片已经去畸变处理过,选PINHOLE

Single camera:如果所有照片是同一台相机拍的,勾选这个选项,COLMAP会共享内参,提高估计精度。如果混用了不同设备,不要勾选。

特征提取阶段的计算量不大,CPU也能在几分钟内完成。但如果你有CUDA,它会自动使用GPU加速,速度提升明显。

3.4 特征匹配:穷举还是顺序

Processing -> Feature Matching提供了多种匹配策略:

  • Exhaustive Matching:穷举匹配,每张照片和所有其他照片比对。适合照片数量少(<100张)的情况,最彻底但最慢。
  • Sequential Matching:顺序匹配,只和相邻的几张照片比对。适合视频帧或者按顺序拍摄的照片集,速度快但可能漏掉回环。
  • Vocabulary Tree Matching:基于词汇树的匹配,适合大规模场景,需要预先训练词汇树文件。

对于大多数Windows用户的小规模项目,直接选Exhaustive Matching就行。如果照片超过200张,考虑用Sequential Matching并设置合适的overlap参数(通常设为10)。

匹配阶段是GPU加速收益最大的环节。我实测过一组80张照片的数据,CPU穷举匹配跑了将近40分钟,换成CUDA版本后不到3分钟就完成了。所以如果你还在用CPU版本,强烈建议换成CUDA版本。

3.5 稀疏重建与结果检查

Reconstruction -> Start Reconstruction,COLMAP会自动完成增量式SfM重建。这个过程包括初始化、图像注册、三角化、光束法平差等步骤。界面上会实时显示注册的图像数量和当前的点云。

重建完成后,你会在输出文件夹里看到几个文件:

  • cameras.bin:相机内参
  • images.bin:相机位姿
  • points3D.bin:稀疏点云

在COLMAP界面里可以直观地看到重建结果。如果点云形状和实际场景大致吻合,说明稀疏重建成功。如果点云散乱、相机位置明显不对,说明特征匹配出了问题,需要回到上一步检查。

一个常见的现象是:部分照片没有被注册。这通常是因为这些照片和其他的重叠度不够,或者纹理太弱。如果未注册的照片比例低于10%,可以接受;如果超过30%,需要重新检查拍摄质量。

4. 稠密重建:显存、路径与时间的三重考验

4.1 从稀疏到稠密的准备工作

稀疏重建只给出了相机位姿和稀疏的特征点,要得到可用的三维模型,还需要进行稠密重建。在COLMAP里,稠密重建分为三步:去畸变、深度图估计、深度融合。

首先需要Reconstruction -> Dense Reconstruction,在弹出的面板里设置工作目录。这个目录同样必须是纯英文路径。点击Undistort,COLMAP会根据稀疏重建估计的畸变参数对图像进行去畸变处理,生成新的图像集。

去畸变这一步本身不慢,但它会生成和原图同样数量的新图像文件,占用额外的磁盘空间。如果原图是200张4000x3000的JPG,去畸变后的PNG可能占用几个GB。提前确保磁盘空间充足。

4.2 深度图估计的显存陷阱

Stereo这一步是稠密重建的核心,也是Windows上最容易崩溃的环节。COLMAP会为每张图像估计深度图,这个过程需要将图像和相关的源图像加载到GPU显存中。

显存不足的典型表现是:程序突然闪退,没有任何错误提示,或者弹出CUDA out of memory的错误。我遇到过好几次跑到一半进程消失的情况,后来在日志里才找到显存溢出的记录。

控制显存占用的关键参数在Stereo面板里:

  • max_image_size:默认是2000,表示将图像缩放到最长边不超过2000像素再处理。如果你的原图是6000x4000,显存又只有6GB,建议降到1500甚至1000。
  • cache_size:GPU缓存大小,单位GB。默认是2,如果显存充足可以调大,显存紧张就调小到1。
  • window_radius:匹配窗口半径,默认5。调小到3可以减少显存占用,但会降低深度图质量。
  • num_samples:采样数量,默认15。降到10可以省显存。

我的经验是:6GB显存跑2000像素的图像基本会崩,降到1500比较稳妥;8GB显存可以跑2000;12GB以上可以尝试原图分辨率。这个不是绝对的,还和图像数量、场景复杂度有关,但可以作为起点。

另一个容易被忽略的点是:Stereo阶段会同时加载多张图像到显存。即使单张图像不大,如果源图像数量多,显存占用也会叠加。可以通过source_image_overlap参数控制每张图像使用的源图像数量,默认是5,显存紧张时可以降到3。

4.3 深度融合与网格生成

深度图估计完成后,点击Fusion进行深度融合,将所有深度图合并成一个统一的稠密点云。这一步主要在CPU上完成,对显存要求不高,但内存消耗较大。如果点云规模很大,16GB内存可能不够,建议32GB以上。

融合完成后会生成fused.ply文件,这就是稠密点云。可以在COLMAP里直接查看,也可以导出到MeshLab、CloudCompare等软件里做后续处理。

如果需要网格模型,COLMAP还提供了PoissonMeshingDelaunayMeshing两种网格化方法。Poisson重建对噪声更鲁棒,适合有机形状;Delaunay重建更保真,适合建筑类场景。网格化同样在CPU上运行,大场景可能需要几十分钟。

4.4 路径问题的完整排查链路

路径问题是Windows上COLMAP最隐蔽的坑,因为它的表现不一定是报错,可能是各种奇怪的行为。我整理了一个排查链路:

症状一:导入图像时列表为空。检查图像文件夹路径是否含中文或空格。即使文件夹名是英文,如果它所在的父目录含中文,也可能出问题。把整个项目移到D:\colmap_project这样的纯英文路径下。

症状二:特征提取时提示无法写入数据库。检查数据库文件路径。SQLite对路径中的特殊字符很敏感,确保路径里没有#&%等字符。

症状三:稠密重建时找不到去畸变后的图像。COLMAP在内部用相对路径引用图像,如果工作目录设置不当,会导致路径解析错误。确保Dense Reconstruction面板里的workspace路径和实际输出路径一致。

症状四:导出模型时文件名乱码。这是COLMAP对非ASCII路径支持不完善导致的。导出路径同样要用纯英文。

提示:养成习惯,从项目创建的第一步就用纯英文路径,可以避免90%以上的路径相关问题。我现在的做法是在D盘根目录建一个colmap_workspace文件夹,所有项目都放在里面,用项目名做子文件夹。

5. 性能调优:让重建跑得更快更稳

5.1 硬件配置的实际影响

三维重建对硬件的需求可以拆解为几个维度:

  • GPU显存:决定稠密重建能否跑起来,以及能处理多大的图像。这是最硬的瓶颈。
  • GPU算力:影响特征匹配和深度图估计的速度。CUDA核心数越多越快。
  • CPU核心数:影响特征提取、光束法平差、深度融合的速度。多核心有明显优势。
  • 内存:影响深度融合和网格化能否完成。大场景建议32GB以上。
  • 磁盘:影响图像读写速度。SSD比HDD快很多,尤其是稠密重建阶段频繁读写临时文件。

我用过几台不同配置的机器跑同一组数据(150张1200万像素照片),大致的时间对比如下:

配置稀疏重建稠密重建总计
i7-8700 + GTX 1060 6GB + 16GB RAM8分钟45分钟约1小时
i9-12900 + RTX 3060 12GB + 32GB RAM4分钟18分钟约25分钟
i9-13900 + RTX 4070 Ti 12GB + 64GB RAM3分钟12分钟约18分钟

可以看到,GPU的升级对稠密重建的加速最明显,CPU的升级对稀疏重建和深度融合有帮助。但即使是最低的配置,只要显存够用,也能跑完整个流程,只是时间问题。

5.2 参数调优的实战经验

除了硬件,参数设置对速度和质量的平衡影响很大。以下是我在实际项目中总结的几组配置:

快速预览配置(适合先跑通流程看效果):

  • max_image_size: 1000
  • window_radius: 3
  • num_samples: 10
  • cache_size: 1

标准质量配置(适合大多数项目):

  • max_image_size: 1500-2000
  • window_radius: 5
  • num_samples: 15
  • cache_size: 2-4

高质量配置(适合最终交付):

  • max_image_size: 原图分辨率
  • window_radius: 7
  • num_samples: 20
  • cache_size: 根据显存尽量大

我的建议是:先用快速预览配置跑一遍完整流程,确认重建结果没问题,再用标准或高质量配置重新跑稠密重建。这样避免在参数没调好的情况下浪费几个小时。

5.3 常见崩溃与应对策略

崩溃一:Stereo阶段闪退。九成是显存不足。降低max_image_size,减小cache_size,减少num_samples。如果还不行,检查是否有其他程序占用了显存(浏览器、游戏、视频播放器都会占用)。

崩溃二:Fusion阶段内存溢出。深度融合需要将大量深度图加载到内存。如果内存不足,系统会使用虚拟内存,导致速度极慢甚至卡死。关闭其他程序,或者分批次融合(COLMAP支持指定图像范围)。

崩溃三:程序无响应但CPU占用为0。这通常是COLMAP在等待GPU操作完成,但GPU驱动出了问题。尝试更新显卡驱动,或者在NVIDIA控制面板里将COLMAP的电源管理模式设为"最高性能优先"。

崩溃四:重建结果严重变形。这不是崩溃,但结果不可用。原因通常是特征匹配错误太多。检查是否有重复纹理、反光表面、运动模糊的照片,把这些照片剔除后重新跑。

注意:COLMAP在Windows上没有自动保存中间结果的功能。如果Stereo跑到一半崩溃,之前计算的深度图会保留在workspace里,重新运行时COLMAP会跳过已完成的图像。所以不要轻易删除workspace文件夹。

6. 从点云到可用模型:后处理与导出

6.1 点云清理与裁剪

COLMAP导出的稠密点云通常包含大量噪声和背景区域。直接在MeshLab里打开fused.ply,你会看到点云周围有很多散乱的点,这些是匹配错误或者背景产生的。

清理的第一步是用MeshLab的Select Connected Components功能,删除那些面积很小的连通分量。然后用手动选择工具框选不需要的区域删除。如果场景有地面或墙面,可以用Select Faces by Vertex Quality根据置信度筛选。

COLMAP在深度融合时会为每个点计算一个置信度,可以在导出时设置min_num_pixels参数过滤掉低置信度的点。默认是2,调到3或4可以去掉更多噪声,但也会损失一些细节。

6.2 网格化与纹理映射

点云本身已经可以用于测量和展示,但如果需要更直观的模型,需要进行网格化。COLMAP内置了Poisson重建和Delaunay重建,但我更推荐导出到MeshLab或Open3D里做网格化,参数控制更灵活。

Poisson重建的关键参数是octree_depth,控制网格的精细程度。值越大越精细,但计算量也越大。对于大多数场景,10-12比较合适。重建后会得到一个封闭的网格,但可能包含一些虚假的几何结构,需要手动裁剪。

纹理映射是把原始照片的颜色投影到网格上。COLMAP本身不提供纹理映射功能,需要借助MeshLab的Parameterization + Texturing流程,或者用Open3D、Blender等工具。这一步比较繁琐,但决定了最终模型的视觉效果。

6.3 导出格式的选择

COLMAP支持导出多种格式:

  • PLY:点云和网格的通用格式,MeshLab、CloudCompare、Blender都能读取。
  • OBJ:带纹理的网格格式,适合导入游戏引擎或渲染软件。
  • NVM:VisualSfM的格式,用于和其他SfM工具交换数据。
  • Bundler:另一种SfM格式。

如果只是查看点云,导出PLY就够了。如果需要带纹理的模型,导出OBJ,但要注意OBJ的纹理是单独的文件,移动时要一起移动。

导出的另一个注意点是坐标系。COLMAP默认使用右手坐标系,Y轴向上。但不同的软件对坐标系的约定不同,导入后可能需要旋转。比如Blender是Z轴向上,导入OBJ后需要绕X轴旋转90度。

7. 那些官方文档不会告诉你的实操心得

7.1 拍摄阶段的经验

拍了这么多组照片,我最大的体会是:前期拍摄多花10分钟,后期重建省2小时。具体来说:

  • 用手机拍摄时,锁定曝光和对焦,避免每张照片的参数变化。
  • 环绕拍摄时,保持相机到物体的距离一致,不要忽远忽近。
  • 对于高反光物体,喷一层哑光喷雾或者用偏振镜,否则特征匹配基本没戏。
  • 拍之前先规划路线,确保每个角度都有覆盖,不要拍完才发现背面没拍到。

7.2 数据库文件的管理

COLMAP的database.db文件会随着特征提取和匹配不断增大。一个200张照片的项目,数据库可能达到几百MB。这个文件不要随意删除,因为重新提取特征很耗时。但如果要重新跑匹配,可以在COLMAP里选择Processing -> Database Management,清空匹配结果而不影响特征。

另外,database.db是SQLite格式,可以用DB Browser for SQLite打开查看里面的特征和匹配信息。调试匹配问题时很有用。

7.3 多项目并行时的资源分配

如果你需要同时跑多个重建任务,注意GPU显存是独占的。两个COLMAP实例同时跑Stereo,大概率都会因为显存不足而崩溃。CPU任务(如特征提取、深度融合)可以并行,但会争抢CPU核心,导致每个任务都变慢。我的做法是串行跑GPU密集的任务,并行跑CPU密集的任务。

7.4 日志文件的利用

COLMAP在运行时会输出日志到控制台,但图形界面下控制台窗口可能被隐藏。可以在启动COLMAP时加上--log_level参数,或者在COLMAP.bat里重定向输出到文件。日志里会记录每一步的耗时、显存使用、错误信息,是排查问题的第一手资料。

我遇到过一次重建结果异常的情况,翻日志才发现是某几张照片的EXIF信息里焦距字段异常,导致内参估计错误。删掉那几张照片后问题解决。如果只看界面不看日志,很难定位到这种问题。

7.5 版本升级的注意事项

COLMAP升级版本后,旧版本的数据库和模型文件可能不兼容。升级前备份好项目文件。另外,新版本可能改变了某些默认参数,升级后第一次运行建议用之前的参数配置对比一下结果。

我现在固定用3.8版本,除非有明确的新功能需求,否则不轻易升级。稳定比新功能重要,尤其是在项目交付期间。

7.6 关于CPU版本的适用场景

虽然我一直推荐CUDA版本,但CPU版本也有它的用武之地。如果你只是做小规模的特征提取测试,或者显卡暂时不可用,CPU版本可以应急。另外,CPU版本在兼容性上更好,不会遇到CUDA版本匹配的问题。可以两个版本都保留,根据需要切换。

最后分享一个我常用的检查清单,每次开始新项目前过一遍,能避免大部分低级错误:

  1. 项目路径是否纯英文、无空格?
  2. 显卡驱动是否支持COLMAP所需的CUDA版本?
  3. 磁盘空间是否足够(建议预留原图大小的5-10倍)?
  4. 照片重叠度是否足够,是否有明显模糊或反光的照片需要剔除?
  5. 显存是否足够,max_image_size是否设置合理?
  6. 是否关闭了其他占用GPU的程序?

这套流程跑熟之后,一个中等规模的重建项目从照片到点云大概半天就能完成,剩下的时间主要花在点云清理和网格优化上。三维重建没有捷径,但避开这些坑,至少能让你把时间花在真正创造价值的地方。

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

工业炉自动点火系统的精准控制原理与工程实践

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

作者头像 李华
网站建设 2026/9/21 1:22:39

Vitis 2023.1下LWIP Echo Server与YT8521S PHY调试全攻略

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

作者头像 李华
网站建设 2026/9/21 1:22:33

Holtek BS45F3833高集成MCU如何重塑超声波雾化方案设计

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

作者头像 李华