新闻详情

新闻详情

首页 / 资讯中心 / 详情

双目立体视觉深度图生成全流程:标定、极线校正与SGBM调参实战

发布时间:2026/9/30 3:24:30来源:尧图网络
双目立体视觉深度图生成全流程:标定、极线校正与SGBM调参实战
简介双目立体视觉的课程实验资料面向计算机视觉相关专业的本科生与研究生聚焦立体匹配获取视差图并生成深度图的完整流程。内容以区域相关匹配算法为主线先交代立体匹配的研究背景与在移动机器人导航、航空遥感、工业自动化等领域的应用价值再逐步讲解误差能量函数构建、最小平均误差视差图生成、可靠度计算与去噪筛选以及利用三角关系由视差图计算深度图的方法同时附有Python分步代码与增强对比度、3D显示等结果展示读者可直接对照实验流程复现。包内为1个PDF文件约122KB结构紧凑兼顾算法原理与具体实现适合作为实验设计、课程报告或代码调试的参考。该资源已有279人浏览学习可用于双目视觉实验、立体匹配入门及深度图生成实践。1. 双目立体视觉建立深度图一次实验看清单目拿不到的尺度一个人第一次做双目立体视觉建立深度图的实验时间往往不是花在写代码上而是花在“为什么我的深度图全黑”和“为什么这个点比那个点远这么多”上。这个计算机视觉实验的标准链路是左右两个相机拍同一场景先做双目立体匹配得到视差图再用三角几何把视差换算成深度图。标定、极线校正、匹配、重建四步串在一起任何一环掉链子最后输出都会直接翻车。它也是理解单目为什么拿不到绝对尺度的最好教材——单目能给出相对远近但只有双目能给出单位化的深度值。下面按实验五的常规流程给你一套能跑通的做法新手照着做能出图熟手可以直接拿去对参数边界。2. 相机标定与极线校正深度图质量的第一道关口2.1 双目标定要拿到的四组参数直接说结论深度图不好看一半问题出在标定而不在匹配算法。双目标定最终要拿到四组参数它们决定深度图是否带正确的尺度。第一组是左右相机的内参矩阵 K里面是 fx、fy、cx、cy分别代表像素焦距和光心位置。第二组是畸变系数 k1、k2、p1、p2镜头边缘的径向畸变和切向畸变靠它们纠正不做畸变纠正时图像边缘的视差会明显偏移。第三组是两相机之间的相对旋转 R 和平移 TT 的模就是基线长度这是深度公式 Z fB/d 里那个 B。第四组是极线校正后生成的 Q 矩阵4x4 投影矩阵把校正后的视差图直接映射成三维坐标通常不用手算但要会读关键位置。有个常见偷懒思路两个相机单独标定过能不能直接用单目内参再手动量一下相机间距当基线短距离实验可以粗算但没法保证两相机光轴严格平行、成像平面共面。手动尺量基线误差 1mm在 5 米处就能差出几十厘米深度。所以老老实实走一遍双目标定流程。标定板建议用打印的棋盘格贴在硬板上。两个关键参数容易搞错chessboard_size 是内角点数不是格子数常用 (9,6)square_size 是棋盘格实际边长单位用米因为后续所有深度输出单位都由它决定我习惯固定用米省得最后换算。2.2 极线校正原理把二维搜索变成一维匹配立体匹配最耗时的环节是找对应点左图像素在右图哪一行哪一列如果不做约束在右图全图范围搜索对应点相当于在二维平面上做匹配计算量大且误匹配率极高。极线几何给出的约束是左图像素 p 在右图上的对应点一定在一条直线上这条直线叫极线。如果把两个相机通过重投影调整到“光轴平行、成像平面共面、行完全对齐”的状态所有极线就都变成水平线。匹配从二维搜索降为沿同一行的水平搜索这是极线校正干的事情。数学上校正生成两组重映射表 map1/map2用 cv2.remap 对左右图重采样。stereoRectify 里有个 alpha 参数alpha0 会裁剪掉图像边缘的黑边和变形区域视野略小alpha1 保留全部像素但边缘拉伸变形可能影响匹配。实验用图建议 alpha0减少无效区域。校正是否合格最朴素的验证方法是把左右图上下拼接画几条水平线看场景中同一个点的 y 坐标是否一致。不一致说明校正失败后续 SGBM 算出来的视差图基本没法看。2.3 用 OpenCV 跑通标定到校正的完整流程import cv2 import numpy as np import glob chessboard_size (9, 6) # 内角点数不是格子数 square_size 0.024 # 棋盘格边长单位米决定深度尺度 # 构造世界系下棋盘角点坐标z0 objp np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) objp * square_size obj_points [] # 所有图像共享同一组世界坐标 img_points_l [] img_points_r [] for f_l in sorted(glob.glob(calib/left/*.jpg)): img_l cv2.imread(f_l) gray_l cv2.cvtColor(img_l, cv2.COLOR_BGR2GRAY) ret_l, corners_l cv2.findChessboardCorners(gray_l, chessboard_size, None) if not ret_l: continue # 左图都找不到角点直接跳过 f_r f_l.replace(/left/, /right/) img_r cv2.imread(f_r) gray_r cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY) ret_r, corners_r cv2.findChessboardCorners(gray_r, chessboard_size, None) if not ret_r: continue # 亚像素精化把角点定位从像素级提到亚像素级 criteria (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) corners_l cv2.cornerSubPix(gray_l, corners_l, (11, 11), (-1, -1), criteria) corners_r cv2.cornerSubPix(gray_r, corners_r, (11, 11), (-1, -1), criteria) obj_points.append(objp) img_points_l.append(corners_l) img_points_r.append(corners_r) # 左右各自单目标定得到内参和畸变初值 rms_l, mtx_l, dist_l, _, _ cv2.calibrateCamera( obj_points, img_points_l, gray_l.shape[::-1], None, None) rms_r, mtx_r, dist_r, _, _ cv2.calibrateCamera( obj_points, img_points_r, gray_r.shape[::-1], None, None) # 双目立体标定固定内参只优化两相机相对外参 rms, K1, D1, K2, D2, R, T, E, F cv2.stereoCalibrate( obj_points, img_points_l, img_points_r, mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1], criteria(cv2.TERM_CRITERIA_MAX_ITER cv2.TERM_CRITERIA_EPS, 100, 1e-5), flagscv2.CALIB_FIX_INTRINSIC) # 极线校正R1/R2 是旋转矩阵P1/P2 是投影矩阵Q 用于深度转换 R1, R2, P1, P2, Q, _, _ cv2.stereoRectify( K1, D1, K2, D2, gray_l.shape[::-1], R, T, alpha0, flagscv2.CALIB_ZERO_DISPARITY) # 生成重映射表并执行校正 map1_l, map2_l cv2.initUndistortRectifyMap( K1, D1, R1, P1, gray_l.shape[::-1], cv2.CV_32FC1) map1_r, map2_r cv2.initUndistortRectifyMap( K2, D2, 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)几个参数说清楚。chessboard_size(9,6) 必须和打印棋盘的内角数完全一致findChessboardCorners 经常找不到角点先检查是不是数错了内角。square_size0.024 是硬约束如果和真实边长对不上后面深度值整体偏大或偏小。calibrateCamera 里的 gray_l.shape[::-1] 传的是 (宽, 高)不是 (高, 宽)这个顺序错会让标定结果直接废掉。只统计左右图都能成功检测角点的图像对数量至少 15 对少于 10 对时 stereoCalibrate 的 R/T 很不稳定。flagsCALIB_FIX_INTRINSIC 表示只用单目标定结果作为内参只优化外参好处是内参相对稳定坏处是单目标定本身要是有问题外参也救不回来。CALIB_ZERO_DISPARITY 让校正后主点对齐视差可以近似看成纯水平位移简化深度公式。补充一条经验校正后 remap 图像边缘出现严重拉伸alpha 从 0 改成 1 会保留更多像素但匹配区域变大。如果校正后行没对齐多半不是参数问题而是标定图像拍得太正、缺少倾斜角度回炉重拍标定集。3. 双目立体匹配获得视差图SGBM 参数怎么调才不会崩3.1 匹配算法怎么选BM、SGBM、全局匹配三者的取舍先给结论课程实验和一般工业场景无脑从 SGBM 开始。BM 是最朴素的块匹配左图取一个小窗口在右图同一行滑动窗口选相似度最高的位置作为匹配。速度快但遇到白墙、天空这类无纹理区域以及格子、砖墙这类重复纹理匹配结果会碎成一片视差图几乎没法用。SGBM 是 Heiko Hirschmüller 提出的半全局匹配在局部窗口代价的基础上加了多方向路径代价聚合惩罚相邻像素的视差不连续把“全局平滑”近似到一维路径上做。所以它同时保留了可接受的运算速度又比局部匹配平滑很多是 OpenCV 里综合最稳的选择。全局匹配算法置信度传播、Graph Cut理论上效果最好直接优化整幅图像的能量函数但计算量在实验常用的分辨率下不可接受。除非做的是完全离线的三维重建否则不建议在这条路上耗时间。算法类别代价计算方式速度无纹理/重复纹理课程实验适用度BM局部窗口相似度快差不合适视差图太碎SGBM多路径代价聚合中明显改善推荐全局匹配全图能量优化慢最好可选仅离线场景3.2 用 SGBM 生成视差图最小可运行代码输入 SGBM 的必须是校正后的图不是原始图。import cv2 import numpy as np # rect_l / rect_r 是上一节 remap 的输出 gray_l cv2.cvtColor(rect_l, cv2.COLOR_BGR2GRAY) gray_r cv2.cvtColor(rect_r, cv2.COLOR_BGR2GRAY) # 直方图均衡化对光照不一致的双目图有帮助但它会改灰度绝对分布 gray_l cv2.equalizeHist(gray_l) gray_r cv2.equalizeHist(gray_r) min_disp 0 # 最小视差有近距离物体时扩展范围 num_disp 64 # 视差搜索范围必须是16的倍数 block_size 11 # 匹配窗口边长奇数 sgbm cv2.StereoSGBM_create( minDisparitymin_disp, numDisparitiesnum_disp, blockSizeblock_size, P18 * 3 * block_size ** 2, P232 * 3 * block_size ** 2, disp12MaxDiff1, uniquenessRatio10, speckleWindowSize100, speckleRange32, modecv2.STEREO_SGBM_MODE_SGBM) disp_raw sgbm.compute(gray_l, gray_r) # 原始输出是CV_16S定点数必须除以16得到浮点视差 disp_true disp_raw.astype(np.float32) / 16.0逻辑说明compute 的顺序是 compute(left, right)别传反传反后视差为负深度公式直接得到负距离。输出 disp_raw 是 int16数值除以 16 才是真实像素位移这个 16 是 OpenCV 用定点数表达亚像素精度的结果属于必踩的坑。直方图均衡化在左右相机增益不一致时有用光照均匀的场景可以不加加了之后弱纹理区域的边缘会更脏。参数说明里最影响结果的是四个。numDisparities 决定搜索范围也就决定能感知的最近距离64 只搜 64 像素范围物体离相机近时改成 128 或 256但不是越大约好范围太大会明显增加误匹配。blockSize 是匹配窗口边长3 到 11 之间窗口太小噪声大窗口太大边缘细节被抹掉。P1/P2 是平滑惩罚控制相邻像素视差跳变的代价P2 远大于 P1经验公式是 P18通道数blockSize²P2 用 4 倍到 32 倍室内场景 P2 太大会把真实的深度断层抹平太小则全是椒盐噪声。uniquenessRatio 是唯一性约束10 左右合适太小出现重影太大弱纹理处大片失效。还有两个后处理参数。disp12MaxDiff 是左右一致性检查阈值设 1 或 2相当于把左右图互相匹配后不一致的点剔除设成 10 以上等于没开。speckleWindowSize100 表示面积小于 100 像素的孤立区域会被滤掉speckleRange32 表示相邻视差相差不超过 32 才认为是同一块区域。两个参数专门打掉视差图上的小斑点。3.3 WLS 滤波让视差图从“能看”变成“能测”SGBM 直接输出的视差图即使参数调到位物体边缘和弱纹理区域还是脏。课程实验里常见做法是再加一层 WLS加权最小二乘滤波利用左视图的灰度梯度做深度边缘向导在平滑视差的同时保留边缘。import cv2.ximgproc as ximgproc # WLS 需要右视差图做一致性参考右匹配器必须保留 left_matcher cv2.StereoSGBM_create(...) # 用上一节的参数 right_matcher cv2.ximgproc.createRightMatcher(left_matcher) wls cv2.ximgproc.createDisparityWLSFilter(left_matcher) wls.setLambda(8000.0) # 平滑强度越大越平滑 wls.setSigmaColor(1.5) # 灰度相似度权重 disp_l left_matcher.compute(gray_l, gray_r).astype(np.float32) / 16.0 disp_r right_matcher.compute(gray_r, gray_l).astype(np.float32) / 16.0 disp_filtered wls.filter(disp_l, gray_l, disparity_map_rightdisp_r)关键点有两个。第一wls.filter 的输入必须是已经除以 16 的 float32 视差直接传入 int16 原始视差滤波结果完全乱掉。第二lambda8000 和 sigmaColor1.5 是 OpenCV 官方示例给的参数常见分辨率下可用图像分辨率明显变大时 lambda 要适当调大否则视差图被平滑得没有细节。提示import cv2.ximgproc 报错时先确认装的是 opencv-contrib-python 而不是 opencv-python。常见做法是先卸载 opencv-python再安装 opencv-contrib-python两个包混装会导致调用冲突。如果追求更高的匹配质量SGBM 的 mode 参数可以选 STEREO_SGBM_MODE_HH它对每个像素做更完整的代价计算质量更好但耗时翻倍。实验图像分辨率不高时值得开。4. 把视差图换算成深度图几何关系与坐标系陷阱4.1 深度与视差的反比关系Z fB/d双目视觉最核心的公式只有一行Z f * B / dZ 是点到相机的深度f 是像素焦距B 是基线d 是视差。同一个三维点在左图像素坐标 x_l右图像素坐标 x_r视差 d x_l - x_r。三角形相似关系决定了物体离相机越近两张图上的投影位置相差越大视差越大深度越小无穷远处的点视差趋近 0深度趋近无穷。反比关系带来一个重要工程结论视差误差在近距离影响小远距离被放大。假设视差误差固定 1 个像素3 米处深度误差不到半米10 米外误差可以到好几米。所以深度图的质量上限由基线-焦距组合决定算法只能保证不浪费这个组合不能凭空提升远距离精度。这个公式成立有三个前提左右图像已经极线校正、行对齐校正后主点对齐视差是左右 x 方向的位移。前两个靠 stereoRectify 保证第三个要求视差处理时把无效和负值剔除干净。f 到底用哪个标准写法用 fx因为视差只发生在 x 方向。fy 在理想校正后不参与水平视差计算但在 Q 矩阵三维坐标转换里会用到。B 的单位必须和深度图输出单位一致fx 是无单位像素d 是像素B 用米Z 就是米。如果标定时 square_size 写的是毫米T 输出也是毫米深度图单位就变成毫米数值放大 1000 倍这个坑后面细说。4.2 用 Q 矩阵生成三维坐标NumPy 实现与数据类型OpenCV 的 reprojectImageTo3D 可以直接用 Q 矩阵把视差图转成三维点云这是最不容易出错的路径。# disp_filtered 是 float32 浮点视差前面已除16 points_3d cv2.reprojectImageTo3D(disp_filtered, Q, handleMissingValuesTrue) # 深度就是三维点的 Z 通道 depth_image points_3d[:, :, 2].copy() # OpenCV把无效点设置为很大的负值这里统一置0 invalid (depth_image 0) | np.isinf(depth_image) | np.isnan(depth_image) depth_image[invalid] 0如果不想用 Q 矩阵手动计算单点深度也很快# 手动计算深度便于理解几何关系 fx K1[0, 0] # 像素焦距K1来自stereoCalibrate输出 baseline np.linalg.norm(T) # 基线长度单位与square_size一致 # 避开0视差0可能是无匹配点也可能是无穷远点 disp_safe np.where(disp_filtered 0, disp_filtered, np.nan) with np.errstate(divideignore, invalidignore): depth_manual fx * baseline / disp_safe depth_manual np.nan_to_num(depth_manual, nan0.0, posinf0.0, neginf0.0)reprojectImageTo3D 对输入类型敏感必须是 float32 的真实视差int16 原始视差直接传进去三维坐标全部错乱。handleMissingValuesTrue 会把无效点设成很大的负值所以转换后必须做一次掩码清理不能把它当成真实深度。深度图的数据类型也值得注意。深度是连续值用 float32 保存最稳要显示或存图时转成 uint16单位毫米或厘米更常见。不要用 uint8 存深度图255 的灰度范围装不下几米范围的深度差显示出来一片白。4.3 深度图的空洞、遮挡与边缘处理一张实际的双目深度图几乎一定包含无效区域来源有三个。遮挡区左图能看到的点右图中被前景物体挡住没有对应像素匹配算法无法给出正确视差表现为空洞。无纹理区白墙、天空这类区域任何窗口的匹配得分都差不多给出的视差是随机猜的应该在生成深度时过滤掉。视差不连续区物体边缘前后景深度突变匹配算法容易把前景边缘的像素对到背景上去形成一圈错误的飞点。针对这三种情况分层处理是通用做法。import numpy as np import cv2 # 1. 有效视差掩码 valid disp_filtered 0 # 2. 对有效视差做中值滤波去掉孤立飞点窗口别贪大 disp_clean cv2.medianBlur(disp_filtered, 5) # 3. 可视化版本填小空洞用闭运算测量用版本保留未填充 disp_show np.zeros_like(disp_clean) disp_show[valid] disp_clean[valid] disp_show cv2.normalize(disp_show, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) disp_show cv2.morphologyEx(disp_show, cv2.MORPH_CLOSE, kernel)valid 掩码在滤波后再次使用是防止滤波操作把无效区域的噪声扩散到有效深度里。闭运算和滤波只作用于 disp_show 这个可视化版本真正做测量时用 disp_clean 加 valid 掩码的组合。后续算点云时用 valid 限制输出点不要让无效点参与统计。如果空洞特别大不要急着填洞先回上一章调 numDisparities 和 blockSize。填洞填的是估计值不是测量值遮挡区填出来的深度只能用于显示和粗估计。5. 双目深度实验的五个排查现场现象、原因、解决5.1 视差图大片黑色只有零星亮点现象SGBM 输出图黑色占满整个画面只在物体边缘有几条亮边。查看 disp_raw 的最小最大值最大视差不超过 20。原因最常见是输入图像没做极线校正左右图行没对齐SGBM 在错误行上找不到匹配。其次是 numDisparities 太小真实视差超出搜索范围。再一个可能原因是 compute 顺序传反视差为负显示时全被当无效值过滤。解决先停掉算法把左右图上下拼一起画水平线肉眼确认同一个点是否在同一行不对齐就回第 2 章查 stereoRectify 和 remap。行对齐后打印 disp_raw 的 min/max确认数值范围把 numDisparities 从 64 调到 128 或 256 再试。顺序问题用一行代码排查disp_true 大于 0 的像素占比低于 10%基本就是传反了。5.2 视差图全是椒盐噪声物体轮廓糊成一团现象墙面视差忽高忽低物体边缘毛刺明显整张图像撒了盐。WLS 滤波能缓和一些但边缘还是脏。原因P1/P2 太小平滑惩罚不够强blockSize 设成偶数或太小窗口统计意义不足uniquenessRatio 设成 1 左右等于取消了唯一性约束。解决P2 调到 P1 的 4 倍左右我一般用 P2323blockSize²blockSize 从 11 起步再慢慢降uniquenessRatio 调到 10 到 15。改完看视差直方图平滑区域应该是一条窄峰而不是铺满整个范围。如果还有噪点把 speckleWindowSize 从 100 调到 200孤立小斑点直接杀掉。5.3 深度图数值明显不对已知距离翻倍或者除以100现象深度图能看出物体轮廓但数值离谱。墙上标注 1.2 米的位置实测出来是 1200 米或者 0.012 米。原因单位错配这是双目深度最经典的坑。square_size 写 0.024 米时T 的模大约是 0.12 米如果 square_size 实际是 0.024 但心里当厘米用T 就变成 12 米深度值整体放大 100 倍。另一种情况是 fx 取错用了另一台相机的标定值。解决标定代码里打印基线 np.linalg.norm(T)看数值是否符合物理常识。桌面实验双目基线一般 0.06 到 0.15 米如果打出 12 米单位必错。拿卷尺量相机到墙面的距离做单点验证验证通过再信任全图数值。5.4 标定重投影误差超过 1 像素现象calibrateCamera 返回的 rms_l/rms_r 不是 0.2 或 0.3而是 1.5 甚至 2.0。深度图能出来但物体边缘始终有错位。原因棋盘格拍得太正所有照片几乎同一个角度外参解算退化或者照片数量不足或者棋盘格反光、对焦模糊角点定位不精确。解决重拍标定集至少 15 对图。图像要覆盖视野中心和四个角每张棋盘相对相机有不同倾斜和旋转别总让它正对相机。拍摄时保证棋盘完全在画面内棋盘被裁到只剩一半时findChessboardCorners 虽然能返回成功但角点几何约束变弱误差会变大。5.5 reprojectImageTo3D 出来的三维坐标错乱墙变成斜面现象点云里完整的墙不是平面沿 X 轴或 Y 轴倾斜越往边缘深度越大。原因Q 矩阵和视差图不匹配常见三种情况。第一视差图是原始 int16 没除以 16坐标被缩放 16 倍第二Q 矩阵不是从当前图像分辨率下 stereoRectify 得到的用了另一组分辨率或另一台相机的 Q第三没有做掩码把 0 值视差当有效值送进转换虚拟的无穷远点把平面拉斜。解决先打印 Q 矩阵检查 Q[2,3] 应接近 fxQ[3,2] 应接近 -1/Tx。然后确认视差图已经是 float32 真实视差。转换后立即做有效掩码把小于等于 0 的深度全部过滤。如果还是斜的找个平整墙面单独拍一组只验证墙面点云是否在同一 Z 平面这是最快的隔离手段。6. 用重投影误差和三维点云验证深度图两个硬办法6.1 重投影误差标定质量的量化指标calibrateCamera 返回的 rms 是重投影误差含义是把标定板角点按计算出的内外参重新投影回图像平面与检测角点的平均像素距离。rms 小于 0.3 像素说明标定优秀0.3 到 0.5 正常超过 1 像素就该返工。这个指标不能直接说明深度值准不准但能说明匹配的基础牢不牢重投影误差大时 SGBM 很难救回边缘错位。6.2 深度图转点云人眼直接看三维结果最直观的验证是看三维点云用 matplotlib 的散点图就能完成目测。import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D pts points_3d.reshape(-1, 3) # points_3d 来自第4章 valid (pts[:, 2] 0) (pts[:, 2] 10) # 保留0到10米内的点 idx np.random.choice(np.where(valid)[0], 5000, replaceFalse) # 抽样防卡死 fig plt.figure(figsize(8, 6)) ax fig.add_subplot(111, projection3d) ax.scatter(pts[idx, 0], pts[idx, 1], pts[idx, 2], s1, cpts[idx, 2], cmapjet) ax.set_xlabel(X (m)) ax.set_ylabel(Y (m)) ax.set_zlabel(Z (m)) plt.show()结果怎么判断墙应该是平的桌面是平的物体边缘清晰不存在大片沿 Z 轴漂移的点。X/Y 方向明显拉伸或偏移多半是 Q 矩阵和图像分辨率没配对。颜色用 Z 值上色近处红色远处蓝色的渐变应该是平滑的。6.3 把实验参数固化到配置文件走到这一步深度图项目基本能用了但还差一步“能复现”。我自己的习惯是每次实验结束把标定结果、匹配参数、分辨率、重投影误差写进 JSON 存档换相机或调参时直接对比。{ camera_pair: cam_01_left_right, image_size: [1280, 720], calib: { fx: 823.4, fy: 821.1, cx: 314.2, cy: 235.6, baseline_m: 0.120, rms_pixel: 0.31 }, sgbm: { num_disparities: 64, block_size: 11, p2_factor: 32, uniqueness_ratio: 10 }, wls: { lambda: 8000, sigma_color: 1.5 } }参数不要写死在代码里调参时改配置文件代码里读配置。这样一组参数对应一份结果记录翻车时能快速对照是哪一步出了问题。我是吃过太多“这个图当时参数好像不是这样”的亏自从参数落成文件再没出现过无效排查。如果这组配置里再加一个“单点验证”字段记录相机到某个已知物体的卷尺距离和计算距离就是整个深度链路最简单也最有说服力的正确性证明。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

数据标注规范与质检实战:从边界框到多任务避坑指南 2026/9/30 4:19:05

数据标注规范与质检实战:从边界框到多任务避坑指南

1. 接手一批"标完不能用"的数据集,我第一步查什么我带过一个不算大的标注小组,做过几十个数据集,从道路目标到工业缺陷,从图像到振动信号。最让人头疼的不是标注工人手慢,而是标的量堆上去了,模型…

阅读更多 →
线性回归时间序列预测:Matlab实现与多步预测实战 2026/9/30 4:19:05

线性回归时间序列预测:Matlab实现与多步预测实战

最近后台一直有人在问时间序列预测该选什么模型,做课程设计或者工程项目时,既想快速出结果,又想把原理讲得明明白白。我给出的答案里,反复出现一个名字——线性回归。别看深度学习的声势一年比一年大,在时间序列预测这…

阅读更多 →
AI工程从零搭建:数据、训练、部署与监控全链路实践 2026/9/30 4:19:04

AI工程从零搭建:数据、训练、部署与监控全链路实践

在AI这个圈子里待得越久,我越发现一个有意思的现象:真正让团队拉开差距的,往往不是谁家的模型效果高零点几个点,而是谁能把模型稳定、高效、可维护地跑在生产环境里。前者叫算法研究,后者才是“ai-engineering”。而当…

阅读更多 →
用Python和pygame从零实现坦克大战:面向对象与碰撞检测实战 2026/9/30 4:19:04

用Python和pygame从零实现坦克大战:面向对象与碰撞检测实战

1. 项目概述与核心目标1.1 为什么选择坦克大战作为Python练手项目先说结论:如果你想找一个既能巩固Python语法、又能接触到游戏开发核心概念的实战项目,坦克大战几乎是最优解。它不像扫雷那样偏逻辑、不像俄罗斯方块那样偏算法,坦克大战需要的…

阅读更多 →
用Python与Pygame实现坦克大战:从架构设计到碰撞检测实战 2026/9/30 4:19:04

用Python与Pygame实现坦克大战:从架构设计到碰撞检测实战

1. 项目定位与整体设计思路1.1 这个项目到底能做什么坦克大战,老牌FC游戏里最让人上瘾的几款之一。用Python把它重写一遍,听起来像是个玩具项目,但真正做完之后你会发现,这段代码吃透了游戏开发里最核心的一整套逻辑:对…

阅读更多 →
【Java基础练习——有序数组去重(快慢指针解法)】 2026/9/30 4:18:57

【Java基础练习——有序数组去重(快慢指针解法)】

一、题目 给定有序递增数组,要求原空间内去除重复,不新开数组,最终输出不重复元素,重复元素直接覆盖。 示例数组:{1,1,2,2,2,2,3,3&am…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉