尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

双目立体视觉三维重建Python源码:标定到点云全流程

发布时间:2026/9/27 23:09:43

资讯中心
01
ARTICLE

双目立体视觉三维重建Python源码:标定到点云全流程

双目立体视觉三维重建Python源码:标定到点云全流程
简介这是一份基于Python的双目立体视觉与三维重建项目源码包面向计算机、通信、人工智能、自动化等相关专业的学生、教师及从业者可用于课程设计、期末大作业或毕业设计参考也可作为初学者理解双目匹配和深度估计的实战样例。包内共25个文件核心为14个Python脚本覆盖主流程、立体相机参数配置、WLS滤波、深度计算、图像后处理以及图片与视频互转等辅助工具另有XML工程配置、MP4效果演示和Markdown说明文档整体压缩后约33.78MBzip格式便于下载解压目录结构清晰、按模块组织方便对照阅读。这是作者高分大作业的完整交付答辩评审得分98分代码经过调试测试可直接运行并配有详细注释便于复现实验、调整参数并扩展为不同功能。目前已有86人浏览学习适合希望借助完整案例提升视觉项目实战能力的学习者下载使用。1. 双目立体视觉与三维重建一份能直接改的 Python 高分源码双目立体视觉与三维重建这类项目难点从来不在于某一行代码而在于整条链路——相机标定、立体校正、视差匹配、点云生成——每一环的误差都会传导到下一步。这份基于 Python 和 OpenCV 的三维重建源码把整条链路完整串了起来从棋盘格标定开始到 SGBM 立体匹配生成视差图再到视差图转三维点云并输出带颜色的 PLY 文件代码带逐行注释另附文档说明。对期末大作业、毕业设计来说它是可以直接改用的主体框架对入门者它是「双目重建的第一份可运行代码」。适合需要交大作业的学生、做三维测量预研的工程师、以及想用实际项目入门 OpenCV 的 Python 开发者。2. 重建前必须先搞懂的四个环节标定、校正、匹配与三角化先把概念说清楚。双目三维重建的物理基础是视差同一个三维点在左右相机成像面上存在水平位移位移量反比于景深。但说易行难真实双目系统里左右相机的内参不同、畸变不同、光轴不平行直接拿原始图像做匹配匹配点根本不在同一行上。所以四个环节缺一不可先标定拿到内参和畸变系数再做立体校正让左右图像严格行对齐然后做立体匹配得到视差图最后用三角化把视差换算成三维坐标。这份源码的代码结构也严格按这四个环节划分搞清楚它们后面的代码就能顺着读下去。2.1 相机标定内参、畸变与棋盘格照片的拍摄要求标定解决的是「相机是什么」的问题。内参矩阵描述焦距和主点畸变系数描述镜头带来的径向畸变和切向畸变。常见做法是打印一张棋盘格标定板用左右相机各拍 15 到 20 张不同角度和距离的照片角点检测后交给cv2.calibrateCamera来解算。这里有两个必须留意的细节一是棋盘格定义里 9x6 指的是内角点数量不是棋盘格子的数量把格子数当成角点数会直接导致检测失败二是照片里标定板要占画面三分之一以上角度要覆盖俯仰和左右旋转只在一个平面里平移着拍拍再多张也解不出稳定的焦距。标定脚本核心段可以拆成下面这段来看import cv2 import numpy as np pattern_size (9, 6) # 内角点数不是棋盘格数 square_size 24.0 # 每个格子边长单位 mm用于恢复真实尺度 objp np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) objp * square_size obj_points [] # 世界坐标系下棋盘格角点 img_points_l [] # 左相机图像角点 img_points_r [] # 右相机图像角点 for img_l, img_r in zip(left_images, right_images): gray_l cv2.cvtColor(img_l, cv2.COLOR_BGR2GRAY) gray_r cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY) ret_l, corners_l cv2.findChessboardCorners(gray_l, pattern_size, None) ret_r, corners_r cv2.findChessboardCorners(gray_r, pattern_size, None) if ret_l and ret_r: obj_points.append(objp) img_points_l.append(corners_l) img_points_r.append(corners_r) ret, mtx_l, dist_l, rvecs, tvecs cv2.calibrateCamera( obj_points, img_points_l, gray_l.shape[::-1], None, None) ret, mtx_r, dist_r, rvecs, tvecs cv2.calibrateCamera( obj_points, img_points_r, gray_r.shape[::-1], None, None)这段代码的逻辑是先构造一张棋盘格角点的空间坐标表 objp三个分量是 x、y、zz 恒为 0因为标定板默认摆在 z0 平面上。每张图检测出的角点送入 calibrateCamera它内部用非线性优化同时估计内参和畸变。关键在objp * square_size这一行——square_size 把角点坐标从「格数单位」换算成「毫米单位」只有乘进去了后面重建出来的点云才带物理尺度。很多人漏掉这一行结果形状对、尺寸全错。 calibrateCamera 返回的 mtx 是 3x3 内参矩阵dist 是畸变系数向量。标定完必须看重投影误差 ret一般要求小于 0.1 像素超过 0.3 说明标定照片不合格得重拍。2.2 立体校正极线约束与 Q 矩阵左右图必须行对齐标定只解决单相机。立体校正解决的是双相机之间的几何对齐。校正的目标是让左右图像经过重投影之后满足极线约束——同一个三维点在这两张图里出现在同一行上。行对齐之后立体匹配就从二维搜索简化成一维搜索效率和质量都会明显提升。校正过程里最有价值的产物是 Q 矩阵它是一个 4x4 矩阵后面视差图转三维点云要用它。常见流程是用上一节标定出的内参和畸变配合双目标定得到的旋转矩阵 R 和平移向量 T调用stereoRectify生成校正映射再用remap把原图重采样成校正图R, T cv2.stereoCalibrate( obj_points, img_points_l, img_points_r, mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1], flagscv2.CALIB_FIX_INTRINSIC)[5:7] R1, R2, P1, P2, Q, roi1, roi2 cv2.stereoRectify( mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1], R, T, flagscv2.CALIB_ZERO_DISPARITY, alpha0) map1_l, map2_l cv2.initUndistortRectifyMap( mtx_l, dist_l, R1, P1, gray_l.shape[::-1], cv2.CV_32FC1) map1_r, map2_r cv2.initUndistortRectifyMap( mtx_r, dist_r, R2, P2, gray_r.shape[::-1], cv2.CV_32FC1) rect_l cv2.remap(img_l, map1_l, map2_l, cv2.INTER_LINEAR) rect_r cv2.remap(img_r, map1_r, map2_r, cv2.INTER_LINEAR)stereoCalibrate 用来解算两相机之间的相对位姿 R 和 T。flags 里用了CALIB_FIX_INTRINSIC意思是内参固定用上一节标定结果只优化外参这样可以减少自由度、提高稳定性。stereoRectify 返回的 P1 和 P2 是校正后的投影矩阵Q 是后面重建的核心。initUndistortRectifyMap 把「去畸变」和「极线校正」合成一次重映射输入原始图像输出校正后行对齐的图像。这里有个容易忽略的细节alpha 参数控制校正后图像的裁剪范围。alpha0 会把图像裁剪到最小有效区域黑边最少但可能损失边缘像素alpha-1 保留全部像素黑边明显。对匹配来说黑边只是没有信息不是错误但如果黑边占了超过四分之一的宽度就该回去检查双目标定结果大概率是 R、T 解算出问题最典型的诱因是左右照片配对时顺序错乱。2.3 立体匹配SGBM 与 BM 的选型视差范围和窗口怎么设立体匹配是整个管线里最像玄学的环节。BM 是块匹配速度快但对弱纹理、重复纹理敏感SGBM 是半全局块匹配引入多个方向的路径代价聚合精度明显更好速度也能接受。这份源码用的是 SGBM也是绝大多数课程设计和毕设的选择。匹配结果叫视差图每个像素的值表示左右图中对应点的水平位移单位是像素视差越大物体离相机越近。SGBM 需要调的核心参数有六个numDisparities、minDisparity、blockSize、P1、P2、uniquenessRatio。一段典型配置如下sgbm cv2.SGBM_create( minDisparity0, numDisparities128, blockSize11, P18 * 3 * 11 ** 2, P232 * 3 * 11 ** 2, disp12MaxDiff1, uniquenessRatio10, speckleWindowSize100, speckleRange32, modecv2.STEREO_SGBM_MODE_SGBM ) disparity sgbm.compute(rect_l, rect_r).astype(np.float32) / 16.0逐个说参数含义。numDisparities 是允许的视差搜索范围必须是 16 的倍数设太小近处物体直接没有视差显示成黑色minDisparity 是起始视差物体离相机远时可以设为正值缩小搜索范围。blockSize 是匹配窗口边长取奇数3 到 11 之间窗口太小噪声多窗口太大细节被磨平。P1 和 P2 是平滑惩罚系数P1 用于相邻像素小差异P2 用于大差异一般 P2 取 P1 的 3 到 4 倍。uniquenessRatio 要求最优视差的代价比次优视差小至少 10%用来抑制重复纹理区域的歧义匹配。注意最后一行compute 返回的视差值默认是整数里面有 4 位小数被放在固定小数点表示里所以必须除以 16.0 才得到真正的视差。这个细节很多教程不提漏掉的话后续深度计算会整体偏差一个比例。调试时最直接的办法是打印视差图的直方图确认数值分布覆盖场景实际深度范围如果所有像素集中在 0 附近优先怀疑 numDisparities 太小或者校正没对齐。参数典型值调试方向numDisparities128 或 256偏小则近处全黑minDisparity0场景远时可以调大blockSize11偏小噪点多偏大细节糊P1 / P28*通道*blockSize² / 32*通道*blockSize²纹理区误匹配时增大uniquenessRatio10重复纹理多时调到 15speckleWindowSize100噪点斑块多时调大3. 源码结构与复现步骤先把这条管线完整跑通这一章开始落到操作。很多人拿到源码第一件事是双击运行然后报错信息一串串弹出来就放弃了。正确的顺序是先看文件结构再配环境最后按脚本先后顺序执行。我拿到这套源码后走的也是这条路按下面这个顺序来拆最省时间。3.1 文件结构标定、匹配、重建各自在哪个文件一份标准的双目重建大作业源码通常把三个环节拆成三个脚本calibrate.py 负责单目标定和双目标定把内参、畸变、R、T 保存成参数文件stereo_match.py 负责读入左右图、做校正、算视差reconstruct.py 负责读视差和 Q 矩阵生成点云文件。三个脚本之间通过参数文件传递结果相机参数一般存成 npz 或 yaml下游脚本再 load 进来。文档说明则会以实验报告形式给出标定截图、视差图和重建效果这部分可以直接当作大作业说明书的底稿来改。打开源码后先做一件事确认三个脚本各自导入的模块和输入输出路径。常见的目录约定是 left/ 和 right/ 两个文件夹放左右图像config/ 或根目录放标定参数output/ 放视差图与 PLY 点云。路径和你本地不一致时优先改脚本顶部的路径常量不要动函数逻辑。先把路径理顺后边所有步骤都不会再被「文件不存在」打断。3.2 环境配置Python 版本与 OpenCV 的版本坑运行这份源码需要 Python、OpenCV、NumPy。如果你之前没配过 Python 环境安装 3.8 到 3.10 之间的版本都行然后用 pip 装依赖我建议直接锁定版本避免踩到接口变化pip install opencv-python4.8.1.78 numpy1.24.3 pip install open3d0.18.0 # 可选用于点云可视化这里把版本锁死是有原因的。OpenCV 4.x 里 SGBM 接口是cv2.SGBM_create而 OpenCV 3.x 里叫cv2.StereoSGBM_create大量流传的旧源码在 4.x 上会直接报 AttributeError。NumPy 的坑在 2.x有些老代码里np.float、np.int这类写法在 NumPy 2.x 里已删除运行时会报AttributeError: module numpy has no attribute float需要全局替换成np.float32或直接删掉类型强转。装完依赖后先跑一句python -c import cv2, numpy; print(cv2.__version__, numpy.__version__)确认版本再往下走。提示如果你的系统里同时装过多个 Pythonpip 装到的环境和执行 python 的环境可能不是同一个。装完依赖顺手跑一下上面的 import 检查能避免大量「明明装了却 import 不到」的假故障。3.3 逐步运行从标定脚本到点云输出跑通的标准流程是三步先标定得到相机参数再算视差图最后重建点云。命令行参数我按这类项目最常见的写法列出来实际源码里的参数名可能简写以脚本末尾的 argparse 定义为准python calibrate.py --left left/ --right right/ --out config/ python stereo_match.py --left left/ --right right/ --calib config/ --out output/ python reconstruct.py --disparity output/disparity.npy --calib config/ --out output/第一步 calibrate.py 会检测所有棋盘格图片输出相机参数到 config/ 目录。某张图检测不到角点时会打印跳过信息这不要紧只要参与标定的左右图对数不少于 15 对就行。第二步 stereo_match.py 读入左右视图依次做校正和 SGBM 匹配输出视差图和彩色视差可视化图。第三步 reconstruct.py 读入视差图和 Q 矩阵用 reprojectImageTo3D 生成三维坐标保存为 PLY。拿到源码后先跑python calibrate.py --help或者直接看脚本最后几行的 argparse 代码确认参数名再执行省得逐个试错。读代码时重点盯三处调用calibrate.py 末尾的参数保存、stereo_match.py 里的 sgbm.compute、reconstruct.py 里的 reprojectImageTo3D。这三行是两个脚本的命脉跑通了整条管线就通了。3.4 输入约定图像尺寸、左右顺序与文件夹命名这节不贴代码但很关键。双目重建对输入图像有硬性要求左右图必须来自同一时刻的同步采集尺寸必须一致命名要能对应上。很多源码用的名字是 imgL.png 和 imgR.png。如果你的数据是从视频里抽帧来的还要注意左右目不能错位。用自己相机拍数据时我习惯把左目命名成带 L 后缀、右目带 R 后缀比如 scene_01_L.jpg、scene_01_R.jpg脚本里 zip 配对时不会出现左右交叉。图像尺寸方面如果左右图不是同一分辨率stereoRectify 会直接报错或者得到一张歪掉的校正图处理办法是统一 resize 到较小那张的尺寸再做后续流程。4. 从视差图到彩色点云重建落地细节与代码对照视差图是中间产物点云才是最终交付。这一章讲清楚视差怎么变成三维坐标、颜色怎么绑上去、最终怎么保存成通用格式。这里也是最容易出现「重建出来一团乱点」的阶段先把原理捋顺再写代码。4.1 视差图转深度Q 矩阵与 reprojectImageTo3D 的原理深度与视差的关系用物理模型解释最直接深度 ≈ 基线距离 × 焦距 / 视差双眼相距越远、视差越大、物体越近。但在实际双目系统里左右相机校正后的焦距、主点不完全一样直接用两个标量算会引入误差。所以 OpenCV 把整个换算装进了 Q 矩阵Q[0][3] 和 Q[1][3] 编码了主点偏移Q[3][2] 编码了基线与焦距的关系。调用 reprojectImageTo3D 时OpenCV 对每个像素做 Q 矩阵变换把视差值换算成以左相机为原点的三维坐标。核心代码很短import cv2 import numpy as np disparity np.load(output/disparity.npy).astype(np.float32) Q np.load(config/Q.npy) points_3d cv2.reprojectImageTo3D(disparity, Q, handleMissingValuesTrue) valid_mask points_3d[:, :, 2] 0 # 深度为正才视为有效点 valid_points points_3d[valid_mask] # (N, 3)逻辑说明reprojectImageTo3D 输出的 points_3d 是 HxWx3 的数组每个像素对应一个三维坐标。handleMissingValuesTrue 时视差无效的位置会得到一个异常深度值所以下一步用depth 0生成掩膜只保留有效点。如果你看到 valid_mask 里有效点的比例特别低比如不到 30%说明视差图质量问题很大先回第 2 章调 SGBM 参数比在这里强行补救高效得多。参数说明Q 矩阵来自 stereoRectify不同源码保存格式不一样有存 npy 的、有存 yaml 的。读取后可以打印出来看一眼非零元素集中在最后一列和 Q[3][2] 附近。如果这个矩阵全是 0说明 stereoRectify 没被调用或者保存失败后面生成的点云坐标系会完全错乱。另外视差图里如果有很多孤立小斑块可以在 compute 之后加一行cv2.filterSpeckles(disparity, 0, 100, 32)把面积小于 100 像素的噪点斑块直接置为无效视差这一招对干净点云很有用。4.2 彩色点云把 RGB 像素绑到三维点上重建出来的点云默认只有坐标没有颜色。要做彩色点云需要把校正后左图的 RGB 颜色按像素位置一一对应到三维点。因为校正后的左图 rect_l 和 points_3d 形状一致直接用刚才那个 valid_mask 索引就行。完整写 PLY 文件的代码有点长核心段是这样def write_ply(filename, points, colors): with open(filename, w) as f: f.write(ply\nformat ascii 1.0\n) f.write(felement vertex {len(points)}\n) f.write(property float x\nproperty float y\nproperty float z\n) f.write(property uchar red\nproperty uchar green\nproperty uchar blue\n) f.write(end_header\n) for p, c in zip(points, colors): f.write(f{p[0]:.4f} {p[1]:.4f} {p[2]:.4f} f{int(c[0])} {int(c[1])} {int(c[2])}\n) valid_colors rect_l[valid_mask] write_ply(output/scene.ply, valid_points, valid_colors)这里最容易犯的错是拿原始左图 img_l 去取颜色。points_3d 是在校正图上算出来的原始图像和校正图像不是逐像素对应的直接取色会导致颜色整体错位物体轮廓和颜色对不上。正确做法是从 rect_l 里取因为 rect_l 和 points_3d 的几何关系是一致的。如果你发现点云的颜色像「贴纸贴歪了」基本就是这个原因。写 PLY 时还有个细节颜色通道必须是整数而且范围在 0 到 255 之间。如果你的 rect_l 是 float 类型或值域在 0 到 1先乘 255 再转 int否则 MeshLab 打开后颜色会全部偏白或者偏黑。这个问题在代码里不报错但视觉效果一眼就能看出来。4.3 可视化与保存PLY、OBJ 和 TXT 怎么选点云保存成 PLY 之后查看工具很多。命令行快速查看我一般用 Open3Dimport open3d as o3d pcd o3d.io.read_point_cloud(output/scene.ply) o3d.visualization.draw_geometries([pcd])如果 Open3D 窗口打不开或者你在远程服务器上跑可以把 pcd 保存下来下载到本地用 MeshLab 打开。MeshLab 不需要写代码拖进去就能看还能做后续的网格重建。判断重建是否成功第一眼先看有没有明显的平面结构比如桌面、墙面是否平整再看物体边缘有没有飞点飞点多说明视差图噪声大需要回第 2 章调 SGBM 参数。格式带颜色常用工具适用场景PLY支持MeshLab、Open3D首选通用性最好OBJ支持Blender、MeshLab后续要做网格和贴图TXT/XYZ需另配颜色文件CloudCompare简单调试信息量少5. 三维重建避坑指南五条踩坑记录与排查路径这一章把最容易劝退初学者的坑集中列出来。每一条都按现象、原因、解决三步写调试时你可以直接用 CtrlF 搜现象关键词比从头到尾读代码快得多。这些坑我基本都在自己的双目项目里踩过一遍前四条是大作业答辩前最容易翻车的地方。5.1 标定照片拍了一堆角点却一直检测不到现象findChessboardCorners 对大部分图片返回 False或者检测出的角点位置明显不对。原因最常见的有三种。一是把棋盘格数量当成了内角点数量9x6 的含义是 9 列 6 行内角点对应棋盘其实是 10x7 个格子二是标定板表面反光或者照片模糊角点附近出现高光后检测器失效三是用了非对称圆点标定板却调用了棋盘格检测函数当然一个点都找不到。解决先拿单张照片单独调cv2.findChessboardCorners(gray, (9, 6), None)用cv2.drawChessboardCorners把检测结果画出来看。换成哑光纸打印标定板贴在硬纸板或亚克力上避免折痕。拍照时保证标定板清晰、光线均匀占画面三分之一以上。还不行的就打开cv2.CALIB_CB_FAST_CHECK标志位检测速度会快很多也能绕过一些低对比度场景的误检。5.2 视差图全黑或者全是噪点现象视差图输出后大面积像素值为 0或者近处物体区域全是杂色颗粒。原因numDisparities 设置小于场景实际最大视差近处物体的匹配搜索范围不够被判为无效值blockSize 太小导致弱纹理区域匹配歧义产生碎片噪声左右图没有先做立体校正就开始匹配也会这样。解决先把 numDisparities 调到 128 甚至 256minDisparity 按实际场景调节。用直方图看视差分布确认峰值不在 0 处。blockSize 从 11 起步不要一上来就用 3细节可以后面靠滤波补满屏噪点会直接影响重建心情。校正后的左右图可以叠加成红青图肉眼检查按行错开几个像素如果物体边缘没有对齐成一条直线说明校正没成功不是 SGBM 的问题。5.3 立体校正后黑边巨大图像信息被裁掉一半现象remap 之后的左右图四周有大片黑色区域中间有效视场明显变小。原因alpha 参数设成 -1 时保留全部像素但基线大的双目系统校正后边缘天然会丢失另一个常见原因是 R、T 解算错误比如双目标定图片数太少或者左右照片配对时顺序交叉导致校正矩阵完全不合理。解决先确认 alpha 值想要更多有效视场就改成 alpha0。如果 alpha0 之后黑边还是超过三分之一回去检查 stereoCalibrate 的输入打印 img_points_l 和 img_points_r 的前几个 corner 坐标确认它们来自同一张标定板的同一视角。最稳妥的办法是标定前就把左右文件名排好序按文件名顺序 zip不要依赖文件夹的系统排序。5.4 点云形状对但物体尺寸明显偏大或偏小现象重建出的物体轮廓很完整但用点云坐标测出来的尺寸比真实值大好几倍或者小好几倍。原因标定里 square_size 没有乘进 objp或者写成了 1。这种情况下内参矩阵的焦距单位失去物理意义重建结果只有射影尺度、没有公制尺度。还有一种情况是程序用 stereoRectifyUncalibrated 做了校正这个函数不依赖标定内参输出的 Q 矩阵天然不含尺度信息只能重建出形状不能量尺寸。解决确认objp * square_size这一行存在square_size 填实际打印的棋盘格边长单位毫米。用的是未标定校正的话要么换回完整的标定流程要么只把重建结果当形状参考。另外提一句如果你用 A4 纸打印标定板量边长时要用卡尺量打印出来的实际尺寸不要直接按屏幕上的 24mm 填打印机缩放会带来 1% 到 2% 的误差。5.5 OpenCV 版本不同导致函数名和参数行为不一致现象换了一台机器后原代码报 AttributeError 或者参数校验失败最常见的是cv2.StereoSGBM_create不存在。原因OpenCV 3.x 到 4.x 重构了大量双目视觉 API函数名改了部分默认参数也变了。SGBM 创建函数是重灾区另外 stereoRectify 的返回值数量在两个大版本里也有差异直接解包会报赋值错误。解决统一安装 opencv-python 4.8.1.78。在脚本入口打印cv2.__version__。如果必须兼容 3.x用 getattr 做兼容判断sgbm_cls getattr(cv2, SGBM_create, None) or getattr(cv2, StereoSGBM_create) sgbm sgbm_cls(numDisparities128, blockSize11)注意版本问题最容易出现在「源码在 A 机器能跑、拷到 B 机器就跑不了」的场景。先把两边的 opencv-python 版本对齐再排查别的能省掉至少半个小时的无效调试。6. 进阶用法用 Open3D 做点云后处理与重建质量验证重建出点云只是第一步大作业想拿高分还需要展示后处理和精度验证。这里给出两个在源码基础上最容易扩展的方向点云降采样滤波和重建精度验证都只用 Open3D 就能完成。6.1 点云降采样与统计滤波原始点云数量通常在几十万到上百万直接处理和可视化非常卡。常见做法是先体素降采样再统计滤波去掉离散飞点import open3d as o3d pcd o3d.io.read_point_cloud(output/scene.ply) down pcd.voxel_down_sample(voxel_size0.005) # 5mm 体素 cl, ind down.remove_statistical_outlier(nb_neighbors20, std_ratio2.0) pcd_clean down.select_by_index(ind)voxel_size 按重建场景的尺寸设置场景大就调到 0.01近景物体可以调到 0.002。remove_statistical_outlier 统计每个点到邻域距离的分布超过均值 2 个标准差的点视为飞点。这一步对 SGBM 匹配在弱纹理区域产生的孤立噪点特别有效做完之后点云会干净非常多。6.2 重建精度验证重投影误差与手动测距验证重建质量一种是从标定源头看重投影误差另一种是用两个已知距离的点反算。重投影误差在 calibrateCamera 返回的 ret 里小于 0.1 像素算合格。点云测距在 Open3D 里选两个点计算欧几里得距离和卡尺量出的真实值做对比pts np.asarray(pcd_clean.points) dist np.linalg.norm(pts[a] - pts[b])选点时优先用 A4 纸的长边、桌面宽度这些已知长度来验证。如果误差在 2% 以内这套源码在你这个场景里就真正落地了。从那以后我每次跑完重建都会强制走一遍「先看直方图找视差范围、再标定、再滤波测距」这个流程少一步都可能在答辩现场翻车。希望这个检查习惯也能帮你在自己的项目上少走一圈弯路。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。