ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

单目三维重建实战:深度学习深度估计与点云生成的完整指南

单目三维重建实战:深度学习深度估计与点云生成的完整指南 简介基于Python的单目三维重建项目源码及文档是一份答辩得分98分的高分毕业设计面向计算机、通信、人工智能、自动化等专业学生与从业者可作为课程设计、大作业或毕业设计参考。压缩包共12个文件总大小25.07MB包含Python主程序、相机参数文本、Markdown说明文档及7张标定板与重建效果图像便于对照代码理解标定、匹配到三维重建的完整流程。目前已有180人浏览学习项目自带README说明每一步都配有对应图像结果适合从入门到进阶的读者逐步复现。项目亮点在于完整的单目重建方案通过棋盘格图像采集与相机参数求解结合特征匹配和三维坐标计算最终生成重建效果图代码调试通过可直接运行。基础扎实的学习者还可修改输入图像或参数适配不同应用场景具有很强的学习借鉴与二次开发价值。1. 单目三维重建一张图背后的三维坐标到底该怎么落地用手机对着桌子拍一张照片能不能把桌子的三维模型重建出来单目三维重建做的就是这件事。它不依赖双摄像头、不依赖结构光或激光雷达只靠单张或单目序列二维图像估算出场景的深度再通过相机内参把像素坐标反投影成三维点云。这个方向在毕设里一直很火原因是它兼具“视觉进阶”的逼格和“工程可落地”的实操性既有深度学习深度估计的理论深度又有从点云生成到三维可视化的完整工程链路。但很多同学拿到这类项目源码后第一周就卡住了。最常见的现象是代码能跑出来的点云却是一团乱麻深度图看起来像模像样转成点云后形状完全变形文档写了一大堆答辩时被问一句“你的深度尺度是什么单位”就答不上来。这篇笔记会从算法选型讲到源码模块划分从深度图推理讲到点云反投影最后把我在这个方向上踩过的坑和调参经验都摊开带你把这个项目真正吃透。2. 技术路线怎么选SfM、深度学习深度估计、还是两者混搭2.1 三条路线的对比为什么毕设首选深度学习方案单目三维重建在学术界有非常多的分支但真正能在毕设周期内做完、做透的无非三条路。第一条是传统SfM运动恢复结构加MVS多视图立体匹配路线典型工具是COLMAP。这条路的逻辑是先对多张不同视角的图片做特征提取和匹配估计相机姿态再通过多视图立体匹配生成稠密点云。它的问题很明显——需要多张具有足够重叠度的输入图像特征提取和匹配过程非常依赖纹理质量纹理弱的墙面或纯色桌面基本会重建失败而且整条链路的参数非常多、各自敏感属于典型的“玄学调参”。一周能跑通COLMAP的完整pipeline已经算快的更别说自己复现核心模块。第二条是深度学习单目深度估计路线。核心思路是用一个神经网络经典的是MiDaS系列、DPT系列、Monodepth系列从单张图像直接回归深度图然后利用相机内参把深度图反投影为三维点云。这条路最大的优势是单张图就能重建微弱的透视信息在预训练模型的先验知识辅助下也能估算出相对合理的深度结构比如室内场景的空旷感、桌面物体的大小对比都能大致还原。对于毕设而言你不需要自己训练模型——直接用开源的预训练权重做推理把研究重点放在后续的点云生成、后处理和实验分析上周期完全可控。第三条是混合路线先用深度学习深度估计得到初始深度再用传统多视图几何做细化或尺度对齐。这条路线效果好但复杂度和工作量成倍上升适合想做研究型毕设、且对代码能力有自信的同学。我一般会给学生的建议是选题阶段如果导师没有强制要求自创模型优先走第二条路线。不是因为SfM不重要而是单目深度估计这条路的“研究空间”在工程侧而非算法侧——深度图滤波、点云融合、尺度恢复、网格生成每个环节都能做出亮点也都能拆出可写进文档的分析内容。2.2 Python环境与依赖清单从零搭出一个能跑深度估计的环境这类源码项目最常见的运行环境要求是Python 3.8到3.10深度学习框架PyTorch负责模型推理OpenCV负责图像读写和预处理Open3D负责点云处理和可视化。标注为“高分毕设”的源码通常还会用到一个模型下载机制——MiDaS的权重托管在Hugging Face上首次推理时会自动下载而这一步恰恰是国内同学第一次运行就“卡死”的重灾区。建议的安装流程如下conda create -n mono3d python3.9 conda activate mono3d pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install opencv-python open3d matplotlib pillow huggingface_hub第一行创建虚拟环境时指定Python 3.9是兼容性最稳的选择。PyTorch的安装命令里指明了CUDA 11.8的wheel源如果你机器上没装CUDA也可以去掉--index-url参数安装CPU版——MiDaS的small模型在CPU上跑一张640×480的图大约需要2到4秒演示完全够用。Open3D是点云可视化与保存的核心库它同时支持PLY、PCD等格式的读写后续网格生成和法向估计也都依赖它。环境配置完成后强烈建议先在命令行里跑一条极简的验证命令确认Open3D能正常创建窗口和读写点云文件python -c import open3d as o3d; pcd o3d.geometry.PointCloud(); o3d.io.write_point_cloud(test.ply, pcd); print(open3d ok)这一步能帮你把“环境问题”和“源码问题”提前隔离开。很多同学一上来就运行完整项目报错后分不清是缺包、版本冲突还是代码本身有问题白白浪费大量时间排查。环境这件事值得花半小时验证到位因为它决定了你后面所有调试的起点是否干净。2.3 源码目录结构的工程化设计接手一个毕设项目先读什么高分毕设的源码和普通“能跑就行”的代码最大的差别在目录组织上。一个清晰的项目结构本身就在向评审老师传递你的工程素养。典型的单目三维重建项目源码通常长这样mono3d_reconstruction/ ├── checkpoints/ # 预训练权重存放目录 ├── config/ │ └── default.yaml # 全局配置模型选择、推理参数、相机内参 ├── data/ │ ├── input/ # 输入图像 │ └── output/ # 深度图、点云、网格输出 ├── src/ │ ├── depth_estimation.py # 深度估计模块 │ ├── pointcloud.py # 深度图转点云模块 │ ├── mesh.py # 点云后处理与网格生成 │ ├── visualize.py # 可视化工具 │ └── main.py # 主入口串联完整流程 ├── docs/ │ ├── 设计文档.md │ └── 实验报告.md └── requirements.txt拿到一套陌生的源码时按“配置文件→主入口→核心模块→工具模块”的顺序去读比从头到尾逐行看代码效率高得多。配置文件是理解整套代码的钥匙它定义了模型选择、推理分辨率和相机内参等关键参数这些参数直接影响重建效果。主入口main.py则展示的是整个流程的调用关系——从读图、推理、反投影到保存结果。当你把这两块看完后再去读depth_estimation.py和pointcloud.py的实现细节就能带着问题去理解了这个函数在哪个环节被调用它用到了配置里的哪些参数这里想多说一句关于“文档说明”的事情。很多同学拿到源码里的README或设计文档后直接把它当成论文草稿抄进去这是不合适的。源码里的文档说明通常是开发者的记录思路但你的毕设文档需要的是“问题定义、方案设计、实验验证”的完整叙事。正确地用法是把源码文档作为理解项目脉络的参考然后重新组织成符合自己实验结果的表述。3. 基于深度学习深度估计的重建流程三行命令从图片到点云3.1 深度估计推理模块加载MiDaS模型并生成深度图深度估计是整个重建流程的第一步也是最不需要自己“发明”的一步。业界最成熟的方案是使用Intel开源的MiDaS模型它经过多数据集混合训练对室内外场景都有不错的泛化能力。MiDaS提供了多个变体MiDaS_small适合快速验证和CPU运行DPT_Hybrid在精度和速度之间比较均衡DPT_Large精度最高但对显存要求也最高。毕设项目一般默认用DPT_Hybrid文档里也更容易写出“在保证精度的同时兼顾了推理效率”这样的对比分析。下面这段代码是深度估计模块的核心注释里写明了每一步在做什么# src/depth_estimation.py import torch import cv2 import numpy as np from torchvision.transforms import Compose, Resize, ToTensor, Normalize class DepthEstimator: def __init__(self, model_typedpt_hybrid, devicecuda): self.device device if torch.cuda.is_available() else cpu # midas模型由huggingface_hub自动下载权重到本地缓存 self.model torch.hub.load(intel-isl/MiDaS, model_type, trust_repoTrue) self.model.eval().to(self.device) # 不同模型对应不同的输入transform和归一化参数 midas_transforms torch.hub.load(intel-isl/MiDaS, transforms) if model_type in [dpt_hybrid, dpt_large]: self.transform midas_transforms.dpt_transform else: self.transform midas_transforms.small_transform def estimate(self, img_bgr): # 将BGR图像转为RGB并缩放到模型期望的输入尺寸 img_rgb cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) input_batch self.transform(img_rgb).to(self.device) with torch.no_grad(): prediction self.model(input_batch) prediction torch.nn.functional.interpolate( prediction.unsqueeze(1), sizeimg_rgb.shape[:2], modebicubic, align_cornersFalse, ).squeeze() # midas输出的是逆深度需要做一次翻转得到视觉上更直观的深度图 depth -prediction.cpu().numpy() # 最小最大归一化到[0,1]区间便于保存为8位灰度图 depth_norm (depth - depth.min()) / (depth.max() - depth.min() 1e-8) return (depth_norm * 255).astype(np.uint8), depth这段代码里最需要留意的是两个地方。第一torch.hub.load会自动从GitHub拉取MiDaS的代码并下载权重如果你的网络环境访问Hugging Face或GitHub不稳定可以在环境变量里配置镜像源后面避坑章节会具体讲。第二MiDaS输出的原始值是逆深度disparity值越大代表离相机越近所以在代码里取了负号并做了归一化这样保存出来的灰度图才符合“近亮远暗”的直觉认知。运行推理时通常还会涉及一个预处理细节输入图像不能直接以原始分辨率喂给模型。MiDaS内部会先把长边缩放384small模型或512DPT_Hybrid推理后再把深度图resize回原图尺寸。这个resize过程会丢失一部分细节所以后续点云生成时深度图的分辨率直接决定了点云的稠密程度。3.2 深度图转点云相机内参、反投影公式与代码实现拿到深度图之后三维重建的第二步是把它转成三维点云。这一步的数学基础是针孔相机模型已知相机焦距(f_x, f_y)、主点((c_x, c_y))以及像素坐标((u, v))处的深度值(z)可以通过公式(x (u - c_x) * z / f_x)、(y (v - c_y) * z / f_y)反算出该像素在相机坐标系下的三维坐标。对于单目深度估计来说这里有一个关键前提模型输出的深度是相对深度没有真实的物理尺度。也就是说你得到的点云在形状和比例上是合理的但整体大小是未知的。这并不影响三维结构和可视化展示但如果你需要实际测量尺寸就必须引入参考物或后续的尺度校准。下面是点云生成的实现代码# src/pointcloud.py import numpy as np import open3d as o3d def depth_to_pointcloud(depth, rgb_image, fx500.0, fy500.0): h, w depth.shape[:2] cx, cy w / 2.0, h / 2.0 # 默认主点在图像中心 # 构建像素坐标网格 u np.arange(w) v np.arange(h) uu, vv np.meshgrid(u, v) # 用深度值计算相机坐标系下的坐标 z depth.astype(np.float32) / 1000.0 # 深度单位假设为毫米转为米 x (uu - cx) * z / fx y (vv - cy) * z / fy # 合并为Nx3的点云坐标矩阵 points np.stack([x, y, z], axis-1).reshape(-1, 3) colors rgb_image.reshape(-1, 3) / 255.0 # 过滤掉无效点深度为0或过远 valid np.isfinite(points).all(axis1) (z.reshape(-1) 0) points, colors points[valid], colors[valid] pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(points) pcd.colors o3d.utility.Vector3dVector(colors) return pcd注意代码里z depth.astype(np.float32) / 1000.0这一行——它假设深度图的存储单位是毫米。实际项目中你的深度图可能经过了归一化到0到255的处理也有可能以米为单位存储这个转换系数必须和你的数据管线保持一致。很多点云比例失调的问题根源都出在这一行的假设和实际数据不符上。另外代码里默认fx fy 500.0这是在没有相机标定信息时的粗略假设。如果输入图像是从相机拍摄的建议先做内参标定用棋盘格拍20张左右用OpenCV的calibrateCamera计算真实焦距否则重建出的物体比例会有明显的横向或纵向拉伸。后续的进阶章节会给出一个更实用的替代方案——直接从手机照片的EXIF信息里提取等效焦距准确度比拍棋盘格更高也更省事。3.3 点云后处理与可视化把稀疏散点变成能看的完整模型原始点云通常包含大量噪声尤其是深度估计在边缘部分的不确定性会让点云出现“飞点”或“毛刺”。常见的后处理手段包括统计滤波去除离群点、体素降采样控制点云密度、法向估计为后续网格生成做准备。Open3D把这些操作都封装得很好几行代码就能完成# src/mesh.py import open3d as o3d def clean_pointcloud(pcd, voxel_size0.005, nb_neighbors20, std_ratio2.0): # 体素滤波控制点云密度同时能轻微降噪 pcd_down pcd.voxel_down_sample(voxel_size) # 统计滤波去除明显偏离局部点群的离群点 pcd_clean, ind pcd_down.remove_statistical_outlier( nb_neighborsnb_neighbors, std_ratiostd_ratio) # 估计法向量后续泊松重建和曲面重建的基础 pcd_clean.estimate_normals( search_paramo3d.geometry.KDTreeSearchParamHybrid( radiusvoxel_size * 2, max_nn30)) return pcd_clean def generate_mesh(pcd, depth9): # 泊松重建把点云表面拟合成封闭网格 mesh, densities o3d.geometry.TriangleMesh.create_from_point_cloud_poisson( pcd, depthdepth) return mesh体素降采样的voxel_size参数在这里尤为关键——它过大时点云密度骤降细节全部丢失过小时滤波效果不明显噪声依旧。经验上先取点云整体包围盒边长的千分之一作为初始值然后根据可视化效果上下微调。统计滤波的std_ratio控制离群判定的严格程度默认2.0是相对合理的起点如果场景里飞点很多可以调到1.5加强剔除。最后在主入口里把上述流程串联起来python src/main.py --image data/input/desk.jpg --model dpt_hybrid --output data/output/主入口读入图片后调用DepthEstimator.estimate生成深度图再调用depth_to_pointcloud生成点云接着做滤波压缩和网格生成最终把深度图、点云.ply格式和网格.obj格式一并写入输出目录供后续实验对比使用。4. 把代码变成“高分毕设”文档结构、实验对比与答辩准备4.1 从源码到设计文档架构图、模块划分与算法选型理由很多同学在写毕设文档时容易把源码的README抄得面目全非或者把代码逐段贴进文档凑字数。这两种做法都拿不到高分。评审老师真正想看的是你是否理解整个系统的数据流以及你能否说清楚每个模块为什么这样设计。一份合格的毕设文档建议按下面这个映射来写文档章节对应源码/技术内容写作重点绪论/背景项目整体定位单目三维重建的应用场景机器人导航、AR、自动驾驶、文物保护相关技术depth_estimation.py中的模型选型MiDaS vs. Monodepth2 vs. DPT为什么选深度学习方案而非传统SfM系统设计main.py与模块划分数据流图图像输入→深度估计→点云生成→滤波→网格重建模块实现pointcloud.py、mesh.py反投影公式推导、滤波器原理、参数选取依据实验与分析data/output下的实验结果不同场景的深度图与点云对比定量指标评估总结与展望整体项目方法的局限性和改进方向这里的核心逻辑是文档的每一章都必须能和源码中的某个模块对应上。评审老师随机挑一个模块问你实现细节你都能说出“这个模块输入是什么、输出是什么、用了什么算法、为什么这么选”这个项目就真正变成你自己的了。4.2 实验设计用定量指标和对比图撑起“高分”门面光有能跑通的代码还远远不够高分毕设一定需要“实验结果”来支撑。“能重建出点云”和“重建得比别人好/比baseline好”是两回事。实验设计建议分三步走。第一步准备测试数据。用你自己的手机或相机拍5到10个场景覆盖室内桌面物体、房间角落和室外建筑局部、树木两种情况图像分辨率统一resize到某一固定值并记录原始参数。这些图片放到data/input/下保证实验可复现。第二步跑对比实验。用同一个场景分别跑MiDaS_small、DPT_Hybrid和DPT_Large三个模型记录它们的推理时间、点云数量和主观重建效果整理成对比表。这里不需要编造数据只把你真实跑出来的数据填进去并简单分析即可——分析的方向可以是“小模型速度快但边缘锯齿明显大模型细节丰富但耗时翻倍”。第三步做定量的误差分析。深度估计领域最常用的三个指标是绝对相对误差Abs Rel、均方根误差RMSE和阈值准确率(\delta_1, \delta_2, \delta_3)。如果你能找到测试场景对应的真实深度例如用Kinect拍同一场景就可以计算这些指标没有真值设备的话可以用不同模型之间的相对差异作为替代分析维度。值得注意的是单目深度估计的深度是相对尺度和真值或另一个模型的输出比较前需要做一个尺度对齐常见的做法是计算一个全局缩放因子让两个深度图的均值或中位数对齐。这一步不做你的误差指标会大到离谱答辩时会被追问到失控。4.3 答辩前的高频问题清单提前准备好这五个问题的答案答辩是毕设的最后一关评审老师的问题通常集中在“为什么”“怎么验证”“局限是什么”这三个维度上。提前准备好下面这五个问题的回答思路能让你在现场少一些手心冒汗的时刻你的深度图单位是什么点云的物理尺寸是多少回答要点说明MiDaS输出的是相对深度/逆深度点云尺度不代表真实物理尺寸如需真实尺度需引入标定物或深度传感器辅助。为什么不用传统SfM方法回答要点单目深度估计不需要多视角输入对弱纹理场景的鲁棒性更好且推理速度快但要承认传统方法在姿态估计上更精确。深度估计模型的训练数据是什么你的场景是它的分布内吗回答要点MiDaS混合了室内外多种数据集如果测试场景与训练分布差异大比如航拍视角效果会显著下降——这恰恰可以引向“改进方向”的回答。你的创新点是什么回答要点可以是深度图滤波融合策略、点云后处理流程的改进或者针对特定场景的适配方案。坦诚地说是“应用组合创新”也比说“没有创新点”好一万倍。项目还能怎么改进回答要点尺度恢复、边缘细化、融合多帧深度、引入语义信息辅助重建。这一问主要是考察你对领域前沿的了解程度答出两到三个具体方向即可。5. 单目重建踩坑指南推理失败、点云镜像与模型下载的五个高频问题5.1 模型下载失败或卡在Downloading...不动现象第一次运行torch.hub.load(intel-isl/MiDaS, ...)时命令行一直停留在下载状态最后报超时或无法连接的错误。原因MiDaS的代码仓库和预训练权重托管在GitHub和Hugging Face上默认的下载通道在部分网络环境下访问不稳定。这是环境问题而非代码问题。解决把torch.hub的下载源指向国内可访问的镜像在代码最前面加上环境变量即可import os os.environ[HF_ENDPOINT] https://hf-mirror.com设置HF_ENDPOINT环境变量后Hugging Face的下载请求会走镜像地址权重文件约几百MB通常几分钟内就能拉下来。如果下载中断过可以检查本地缓存目录Windows下在C:/Users/你的用户名/.cacheLinux下在~/.cache删除残留的半截文件后重试。权重下载完成后缓存在本地后续运行不再需要联网。5.2 点云整体是镜像的或上下颠倒现象生成的PLY文件在Open3D里打开后物体形状是对的但左右方向是反的或者朝上的面朝下。原因坐标系的定义不一致。代码里反投影时使用的是图像坐标u向右v向下而三维空间习惯上是右手坐标系通常y轴向上。如果直接把v坐标映射到三维的y轴就会出现“深度方向正确但垂直方向颠倒”的镜像问题。另一个常见原因是MiDaS输出的是逆深度直接当成深度用导致前后翻转。解决在反投影时把v轴的像素坐标翻转一次vv h - 1 - vv # 把图像v轴翻转对应三维y轴向上然后检查一下深度是否做了负号转换。如果魔改过深度图的归一化方式务必先在可视化工具里同时加载原始图像和生成的PLY确认物体朝向和真实场景一致后再做后续的网格生成。这一步验证不能省因为一旦点云朝向错了后面所有的滤波和重建都在错误数据上操作。5.3 深度图正常但点云里有大量飞点悬浮在物体外部现象点云的大体轮廓是对的但边缘处有一簇一簇的离散点云“飘”在物体外围看起来像是噪点被放大了。原因深度图在物体边缘处本身就不准确——前景和背景的深度跳跃剧烈模型输出的深度值会在边缘处产生过渡带。反投影后这些过渡带里的点就落在了真实物体外侧。另外fx和fy的估计偏差也会放大边缘误差。解决先用remove_statistical_outlier做一轮离群点剔除把孤立飞点清掉。如果飞点仍然很多可以再加一步基于深度的连通域分析把深度图转成二进制掩码只保留与中心像素深度差在阈值范围内的区域。最简单的做法是直接把深度图做一个中值滤波后再反投影depth_filtered cv2.medianBlur(depth_raw, ksize5)中值滤波的窗口大小决定边缘保留和噪声抑制的平衡5×5是一个比较温和的起点窗口太大时细长物体会被抹平。5.4 泊松重建出现大面积空洞或表面变厚“鼓包”现象点云看起来相当干净但用create_from_point_cloud_poisson后生成的Mesh要么在物体表面出现大洞要么表面像吹了气一样膨胀变形。原因泊松重建对点云法向的质量极其敏感。法向估计不准或方向不一致时重建算法会拟合出一个错误隐式曲面产生空洞或鼓包。此外depth参数设置过高如10或11时网格会过拟合点云噪声。解决先可视化法向o3d.visualization.draw_geometries([pcd], point_show_normalTrue)检查法向是否指向同一侧。如果法向方向错乱需要先做法向定向——Open3D提供orient_normals_consistent_tangent_plane简单场景下直接调用就能纠正。然后把泊松重建的depth参数改为6到8之间并配合linear_fitTrue参数mesh, densities o3d.geometry.TriangleMesh.create_from_point_cloud_poisson( pcd, depth8, linear_fitTrue)linear_fit开启后会在线性空间内做拟合对带噪声的点云更友好代价是细节略微损失。5.5 Python环境里装了Open3D但import报错或无法显示窗口现象import open3d成功但draw_geometries弹出窗口后立即崩溃或者报缺少DLL/无法初始化GLFW的错。原因Open3D的GUI依赖OpenGL环境在远程服务器或无图形界面的环境下默认无法显示窗口在Windows上则可能是显卡驱动过旧导致OpenGL版本太低。解决如果是远程开发改用write_point_cloud保存文件后下载到本地查看或者在代码里使用headless模式的渲染后端。如果本地有显示器但窗口崩溃先更新显卡驱动再确认Open3D版本与Python版本的对应关系pip show open3dOpen3D的预编译包对Python小版本有明确要求比如某些版本不支持Python 3.12。遇到安装冲突时最省事的方式是退回Python 3.9环境重装这一版兼容性最稳。提示这个坑在Windows Python 3.11/3.12的组合里出现频率最高环境搭建时直接选用Python 3.9可以绕开一大部分莫名其妙的兼容性问题。6. 进阶技巧用EXIF焦距替代默认内参多尺度融合提升边缘质量整个重建流程跑通之后想再往上提升质量我强烈建议做两件事一是把相机内参从“拍脑袋默认值”升级为真实值二是对深度估计做多尺度推理融合。这两个改进代码量加起来不超过50行但对重建比例还原和边缘细节的提升立竿见影。先看内参改进。智能手机拍摄的JPEG照片在EXIF信息里记录着35mm等效焦距这个数值结合传感器裁切系数可以反算出像素单位下的焦距。用Pillow就能读取from PIL import Image img Image.open(data/input/phone_photo.jpg) focal_length_35mm img._getexif()[37386] # EXIF标签0x918A对应FocalLength focal_pixels focal_length_35mm / sensor_width_mm * image_width_pixels这里的sensor_width_mm需要根据机型查一下手机多数在5.7到6.4毫米之间换算出的focal_pixels直接替换掉点云生成时的fx和fy。老代码里默认500的数值在大部分手机上偏低会导致点云在平面方向被拉伸。再看多尺度融合。深度估计模型对不同尺度的特征敏感度不同——大物体在低分辨率下推理更稳定细节边缘在高分辨率下保留更多。经验做法是对同一张图分别缩放到0.5倍、1.0倍和1.5倍分别推理得到三张深度图再归一化后取中值融合scales [0.5, 1.0, 1.5] depths [] for scale in scales: resized cv2.resize(img_bgr, None, fxscale, fyscale) _, depth estimator.estimate(resized) depth_resized cv2.resize(depth, (w, h)) depths.append(depth_resized) depth_fused np.median(np.stack(depths), axis0)中值融合比均值融合更能抵抗某个尺度下的异常值尤其适合边缘区域的深度跳变。后台跑一轮多尺度推理的时间大约是原来的三倍但换来的是边缘毛刺明显减少、点云地面更平整。这两个技巧做完后把改进前后的点云摆在一起对比——改进前桌面边缘是锯齿状的一串毛边改进后是笔直的一条棱线这种直观变化比任何文字描述都有说服力。我自己的习惯是每次都把改进前后的对比图存进实验记录里答辩时直接放出来效果远好于念PPT。单目三维重建这个方向入门门槛看着高其实拆开了就是一个深度估计模型加一个反投影公式真正花时间的地方在工程细节和实验分析。把这篇笔记里的流程走一遍你的项目就不再是“能跑”而是“能讲清楚、能拿得出手”。希望帮到你。本文还有配套的精品资源点击获取
返回列表