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

双目视觉测量物体尺寸:从相机标定到三维重建的Python实战

发布时间:2026/9/24 22:31:19

资讯中心
01
ARTICLE

双目视觉测量物体尺寸:从相机标定到三维重建的Python实战

双目视觉测量物体尺寸:从相机标定到三维重建的Python实战
简介基于Python与OpenCV实现的双目视觉尺寸测量项目源自个人毕业设计答辩评审98分。项目面向计算机、人工智能、自动化等专业的学生、教师及从业者既能作为双目视觉与图像处理课程设计、大作业或毕业设计的参考也适合入门者学习从图像采集、相机标定、立体匹配到物体尺寸测量的完整流程。压缩包共含23个文件以1个Python主程序、1个Markdown说明文档为主另附21张JPG格式的左右视图与实际测量结果图便于对照运行结果理解算法效果整体包体仅2.26MB轻量且易部署。目前已有200人学习下载具有一定的学习参考价值。源码经过调试可运行配套文档说明清晰可帮助读者快速复现测量过程基础较好的使用者还能在此基础上修改图像处理或测量逻辑扩展为不同场景下的尺寸测量功能。1. 双目视觉测量被摄物体尺寸为什么值得用PythonOpenCV做搞机器视觉测量的人都知道单目测尺寸是个坑一张图里的像素数确实能算长度但只要相机到物体的距离一变像素当量立刻失效测出来的数据根本没法用。双目视觉测量用两台相机模拟人眼通过左右画面同一点的视差反推深度再把二维像素坐标映射成三维空间坐标物体的长宽高才真正落到物理尺度上。这套方案用PythonOpenCV实现从相机标定、立体校正、视差计算到尺寸输出链路完整每一步都是可以单独写进文档的看点非常适合作为自动化、计算机、电子信息类本科毕业设计也可以当作后续三维重建课题的起点。很多同学拿到类似题目第一反应是“跑通一个demo就行”实际上一旦开始测真实物体你会发现标定、光照、测量距离、参数选择全都影响结果。这篇文章按照我自己做过的一个物品测量方案来拆解先讲明白双目测距的数学基础再给出可复制的标定和匹配代码最后把最容易翻车的几个坑列出来照着做至少能少走两周弯路。2. 从三角测距到立体标定双目测量为什么能拿真实尺寸2.1 双目测尺寸的原理视差、基线和深度绑定在一起双目视觉的出发点是一个简单的相似三角形关系。假设左右两个相机光心之间的距离叫基线B相机焦距是f空间中某个点在左图成像位置是xl在右图是xr那么视差d xl - xr深度Z满足Z f × B / d这里的f带单位像素B带单位毫米d是像素差所以Z的单位就是毫米。这个公式是整个项目的地基。你只要拿到了每个像素的视差就能知道每个像素对应的空间点离相机多远再配合左右图校正后的像素坐标就能重建出三维点云。物体尺寸不再是“图片里占了多少像素”而是两个三维点之间的欧氏距离。误差分析也要在这时候就想清楚。视差误差δd会被放大到深度误差上近似关系是δZ ≈ Z² / (f × B) × δd。它的意思是物体越远深度误差按距离平方增长基线越宽、焦距越长同样的视差误差带来的深度误差越小。所以不要一上来就用两个手机并排当相机用几十毫米的基线只能覆盖近距小物体。我一般会先列一个设计表格目标测量距离、目标精度、相机分辨率、基线长度四者对不上就先别动手。2.2 用OpenCV做双目标定标定板采集和参数设置标定要解决的任务是拿到左右相机各自的内参焦距、主点、畸变系数和两相机之间的旋转R、平移T。OpenCV的标准流程是用棋盘格标定板采集15到20对不同角度下的图像对检测亚像素角点再跑cv2.stereoCalibrate。采集图像对这一步很关键两条命脉一是左右相机必须采集同一个时刻的画面二是标定板要覆盖各个视野位置别只放在正中间。没有硬件同步触发时最稳的做法是固定相机用手持标定板低速移动然后程序里同时抓取两个摄像头的当前帧。import cv2 import numpy as np # 棋盘格规格写内角点数不是格子数。10x7的棋盘内角点是9x6 BOARD_W 9 BOARD_H 6 CHESS_SIZE 25.0 # 格子边长单位mm打印后请用卡尺实测 # 亚像素角点细化条件最多30次迭代精度0.001 criteria (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-3) def detect_board(gray): # 自适应阈值和归一化能显著提升光照不均匀时的检测率 flags cv2.CALIB_CB_ADAPTIVE_THRESH | cv2.CALIB_CB_NORMALIZE_IMAGE ret, corners cv2.findChessboardCorners(gray, (BOARD_W, BOARD_H), flags) if ret: corners cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria) return ret, corners # 每对图像检测成功后记录左右角点和物点坐标 # 物点坐标是“标定板自己坐标系”下的三维坐标单位与CHESS_SIZE一致 objp np.zeros((BOARD_W * BOARD_H, 3), np.float32) objp[:, :2] np.mgrid[0:BOARD_W, 0:BOARD_H].T.reshape(-1, 2) objp[:, :2] * CHESS_SIZE逻辑说明findChessboardCorners找的是棋子格的内角点数量比棋盘格子数少1。CHESS_SIZE决定了三维重建输出单位如果你填25后面所有点云坐标默认是毫米填0.025单位就是米。cornerSubPix是在整数角点附近做灰度梯度拟合把角点定位精度从像素级提升到亚像素级这一步对后续标定RMS影响明显不能省。采完图像对开始双目标定# 双目标定固定单目内参只优化双目的相对外参 rms, K1, d1, K2, d2, R, T, E, F cv2.stereoCalibrate( objpoints, # 所有有效帧的物点集合 imgpoints_l, # 左相机角点集合 imgpoints_r, # 右相机角点集合 K1, d1, K2, d2, # 单目相机内参和畸变系数 (img_w, img_h), # 图像分辨率必须和采集分辨率一致 criteriacriteria, flagscv2.CALIB_FIX_INTRINSIC, ) print(RMS , rms) print(基线长度 , np.linalg.norm(T))参数说明CALIB_FIX_INTRINSIC表示双目标定时不再回头优化内参只求两个相机之间的R和T这样能减少未知量的个数标定结果更稳定。T的模长是两相机光心之间的距离单位就是标定板CHESS_SIZE的单位。通常用尺子粗测两个镜头中心的间距如果T的模和粗测值差10%以上基本可以判定标定数据里有坏帧。2.3 标定结果怎么验收RMS、重投影误差和极线目测标定跑完不是看它“没报错”就算过三个检查项缺一不可。第一是RMSstereoCalibrate返回的rms是重投影均方根误差单位像素。一般低于0.8像素可用能到0.2到0.5像素说明图像质量不错。RMS长期大于1.0通常不是算法问题是数据问题优先删掉模糊、反光、标定板占据画面太小的帧而不是去调参数。第二是重投影误差的分布。用cv2.projectPoints把每个物点按当前内外参投影回左右图计算与检测角点的距离再把所有角点的误差画成直方图。如果大部分误差在0.5像素以内只有几帧特别大这几帧就是罪魁祸首直接排除后重新标定而不是让整体数据被它们拉偏。第三是极线约束的目测检查。立体校正做完后左右图中的对应点必须位于同一水平线上。把两张校正后的图拼接画几条水平参考线看物体边缘和标定板角点是否都落在线上。这个检查虽然糙但非常直观也是答辩时能展示的中间结果。极线大面积对不上往后的立体匹配无论怎么调参数都是白费力气。3. 立体校正与SGBM视差计算从左右图到深度点云的落地实现3.1 立体校正stereoRectify和remap的配合用法双目标定拿到R和T后左右图像还不能直接做匹配。因为两个相机存在旋转和平移同一个目标在左右图中的成像行并不对齐直接匹配不仅慢而且错误多。立体校正的目的就是把左右图像“掰正”让两张图的极线变成水平线对应的目标落在同一行上匹配从二维搜索降为一维搜索。# 立体校正alpha0会裁剪边缘无效区域alpha1保留全部像素但拉伸 R1, R2, P1, P2, Q, roi1, roi2 cv2.stereoRectify( K1, d1, K2, d2, (img_w, img_h), R, T, alpha0, ) # 预先计算remap查找表避免每帧重复计算映射 map1_l, map2_l cv2.initUndistortRectifyMap( K1, d1, R1, P1, (img_w, img_h), cv2.CV_16SC2) map1_r, map2_r cv2.initUndistortRectifyMap( K2, d2, R2, P2, (img_w, img_h), cv2.CV_16SC2) # 每帧只需要一次remap就能得到校正后的图像 rect_l cv2.remap(gray_l, map1_l, map2_l, cv2.INTER_LINEAR) rect_r cv2.remap(gray_r, map1_r, map2_r, cv2.INTER_LINEAR)逻辑说明stereoRectify接收双目标定得到的R和T输出两个单目校正旋转矩阵R1、R2和两个投影矩阵P1、P2以及一个与深度反算紧密相关的Q矩阵。initUndistortRectifyMap把“去畸变校正旋转投影”合并成一张查找表后续每帧只用cv2.remap做插值这是实时处理最有效的做法。参数说明alpha控制校正后图像保留范围。alpha0去掉所有无效黑色区域得到的图像最紧凑适合做匹配但图像边缘会有一点裁剪如果被测物体正好在画面边缘可能丢信息。alpha1保留全部原始像素但会引入明显拉伸视觉上不太舒服。我的习惯是先拿alpha0跑通流程发现问题再退回alpha1看原图对照。两个remap查找表算好之后要保存成npz文件重新启动程序直接加载避免每次标定一次。3.2 SGBM匹配参数物体深度图从哪里来视差计算的核心是立体匹配算法。OpenCV里常用的是BM和SGBMBM快但精度差SGBM用块匹配加平滑约束精度和速度相对均衡。对于毕业设计项目SGBM基本是标配再往上做深度学习匹配属于进阶方向通常没有必要。SGBM有六个参数直接决定结果质量参数作用调节方向minDisparity允许的最小视差值0表示最近处目标远时调大可减少搜索范围numDisparities视差搜索范围必须是16的倍数范围太小远处目标全是空洞blockSize匹配窗口边长取奇数越大低纹理表现越好边缘越糊P1/P2平滑惩罚系数太小噪声多太大物体边缘被抹平uniquenessRatio最佳匹配和次佳匹配的比例差越大越严格弱纹理区域容易全黑speckleWindowSize去除小孤立区域的窗口尺寸设成0关闭误匹配斑点会很多# SGBM参数blockSize先按5到11之间试 sgbm cv2.StereoSGBM_create( minDisparity0, numDisparities16 * 8, # 视差范围128像素远处物体可适当加大 blockSize5, P18 * 3 * 5 ** 2, # P1和blockSize挂钩平滑强度同步调整 P232 * 3 * 5 ** 2, disp12MaxDiff1, # 左右一致性检查阈值防止遮挡处误匹配 uniquenessRatio10, speckleWindowSize100, speckleRange32, modecv2.STEREO_SGBM_MODE_SGBM, ) # compute返回固定点数int16除以16还原真实视差 disp sgbm.compute(rect_l, rect_r).astype(np.float32) / 16.0逻辑说明numDisparities表示最大搜索范围设定值必须为16的倍数这是算法内部按固定步长分块的约束。P1、P2控制相邻像素视差跳变的惩罚P2作为更大的惩罚作用在明显深度边界上如果P2设置太小深度边缘会出现大量噪声。disp12MaxDiff做左右一致性检查把左右图各算一次匹配结果不一致的像素标记为无效能去掉不少遮挡区域的假匹配代价是那些区域的视差变成0。最终得到的disp每个像素存的是“这一个点在左右图中的横坐标差”。值越大代表距离越近。需要把小于0的无效视差先过滤掉不要直接参与后续三维重建。参数调整顺序有讲究先调numDisparities保证目标全程在范围内再看blockSize对边缘的影响最后用uniquenessRatio和speckleWindowSize清理噪声。3.3 从视差图到三维点云reprojectImageTo3D的Q矩阵得到视差图后OpenCV提供了cv2.reprojectImageTo3D它利用Q矩阵完成每个像素从二维坐标加视差到三维坐标的转换。Q矩阵来自stereoRectify的输出里面包含了主点偏移和基线信息不需要手动去计算三角测量的每一步。# 将视差图转成三维点云每个像素对应一个三维坐标 valid_mask (disp 0.5) (disp 128) # 过滤无效视差和过远点 point_cloud cv2.reprojectImageTo3D(disp, Q, handleMissingValuesTrue) # 拿到一个像素对应的空间坐标 z point_cloud[..., 2] # 物体表面深度近似为有效点深度的中位数避免离群点干扰 valid_depths z[valid_mask] surface_z np.median(valid_depths)参数说明handleMissingValuesTrue会把无效像素的三维坐标置为(0, 0, 0)方便后续统一过滤但要注意它代表“无效”而不是“距离为零”如果用np.isfinite去判断会漏掉这些点必须先按是否为0过滤。point_cloud的类型是三通道矩阵形状与图像一致行索引对应图像y坐标列索引对应x坐标。三维重建是整条流水线承上启下的节点。后面的尺寸测量全部基于这个点云只需要知道被测物体在图像上占据哪些像素就能取出对应位置的三维点集合再在三维空间里计算长宽高。4. 测量长宽高轮廓提取、点云映射和尺寸计算代码4.1 在左图上锁定被测物体阈值、形态学与轮廓筛选尺寸测量需要一个“被测物体在哪”的先验。最简单可靠的方案是先做一个颜色或亮度阈值分割把物体从背景里分离出来。演示阶段选一个与背景色差明显的物体比直接用目标检测模型省事得多也更容易向评审解释清楚。# 用HSV颜色空间做阈值对光照变化比RGB稳定 hsv cv2.cvtColor(frame_l, cv2.COLOR_BGR2HSV) # 以浅色物体为例H不限S低V高请按你的物体实际颜色调整 mask cv2.inRange(hsv, (0, 0, 120), (179, 60, 255)) # 开运算去孤立噪点闭运算填补物体内部小空洞 mask cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((5, 5), np.uint8)) mask cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.ones((11, 11), np.uint8)) contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: # 取面积最大的轮廓作为目标同时过滤掉占画面太小的噪声块 cnt max(contours, keycv2.contourArea) if cv2.contourArea(cnt) mask.shape[0] * mask.shape[1] * 0.02: cnt None逻辑说明RETR_EXTERNAL只取外层轮廓避免物体内部纹理形成干扰形态学操作里开运算对白色背景上的黑点噪声有效闭运算负责补齐物体表面因反光产生的空洞。面积过滤阈值0.02是我常用的经验值如果物体占画面比例本来就小可以下调到0.005但这个值不要设成绝对像素否则换分辨率后逻辑就失效了。轮廓提取的结果最终是一个点集编号包含在roi_mask里后续直接用它索引点云。4.2 从轮廓区域取三维点长宽高计算的核心算法这是整个项目最核心的一段代码。拿到roi_mask后从point_cloud里取出所有属于物体的三维点然后做两个关键处理深度滤波去离群点再用PCA主方向计算长宽高。# 物体区域的三维点集合 pts point_cloud[roi_mask 0].reshape(-1, 3) # 过滤无效点非有限值或坐标全为零 valid np.all(np.isfinite(pts), axis1) (np.any(pts ! 0, axis1)) pts pts[valid] # 深度方向用中位数绝对中位差滤波剔除悬空噪点 depth pts[:, 2] med np.median(depth) mad np.median(np.abs(depth - med)) pts pts[np.abs(depth - med) 3 * mad 1e-6] # 重心归零后用SVD求主方向避免在相机坐标系直接取极差 mean pts.mean(axis0) pts_c pts - mean _, _, vt np.linalg.svd(pts_c) # 转到物体坐标系后各轴范围就是长、宽、厚 pts_local pts_c vt.T length pts_local[:, 0].max() - pts_local[:, 0].min() width pts_local[:, 1].max() - pts_local[:, 1].min() height pts_local[:, 2].max() - pts_local[:, 2].min() print(f长{length:.2f}mm 宽{width:.2f}mm 高{height:.2f}mm)逻辑说明SVD在这里的作用等同于PCA。三维点经过中心化后做奇异值分解vt的行向量就是点云分布的三个主方向。第一个方向对应点云方差最大的轴通常就是物体的长边第二个方向对应宽边第三个方向是厚度方向。将点云投影到这三个主方向上取极差得到的就是物体在世界坐标系下的真实长宽高。这样处理的核心原因是物体在画面里往往是倾斜摆放的直接对相机坐标系的x、y、z取max减min会把倾斜尺寸算大这在测量里叫“包围盒膨胀”。参数说明3倍绝对中位差是常用的离群点过滤阈值1e-6是防止深度全部相同时除零的保护。若被测物体表面深度波动本身就大比如有纹路或弧度可以放宽到5倍但别取消滤波。计算结果的长宽顺序由SVD主方向决定和物体长边的朝向一一对应不需要额外指定坐标轴。如果项目里不想引入额外依赖这段纯NumPy实现完全够用。整个源码模块我可以拆成这样标定采集一个文件、立体匹配一个文件、尺寸计算一个文件再加一个绘制标定板和轮廓的可视化脚本。文档说明部分按标定原理、匹配原理、实验数据、误差分析四节写基本就能覆盖毕业设计的评审点。4.3 为什么不建议直接数像素像素当量只在固定深度成立很多人会把“用标定板量一下每毫米多少像素”当成尺寸测量的快捷方式。做法是放一张已知尺寸的标定板在物体旁边算出像素当量然后直接乘以被测物的像素宽度。这么做在一定条件下是准的相机固定、物体表面与标定板在同一平面、且两者深度完全一致。但真实使用中物体前后移动哪怕1厘米成像比例就变了像素当量随之失效。所以这个方案只能说“特定距离下的近似测量”不是真正的视觉测量。双目方案绕开了这个问题每个像素点都有独立的深度值重建后的三维点云自带物理单位物体离相机远一点近一点重建出来的尺寸基本稳定。这也是答辩时最能说明项目价值的地方同一物体在0.5米和0.8米处分别测量结果应该落在同一个容差区间内而不是靠换算系数硬凑。为了验证这套逻辑我会在固定距离放一个标准量块连续测20次记录每次长宽高的输出计算均值和标准差。标准差能反映系统稳定性均值与真值的差反映系统误差。5. 避坑指南双目测量最容易翻车的五个环节5.1 标定板拍了一堆findChessboardCorners却死活检测不到现象代码一直没有检测到棋盘格角点打印ret全是False程序卡在采集循环里出不来。或者偶尔检测到但角点位置明显错乱标定出来的RMS惨不忍睹。原因最常见的是内外角点数写错。打印的棋盘是10×7代码里却填了10和7OpenCV找的是内角点网格交叉点只有9×6个数量对不上永远匹配不了。其次是标定板纸张不平整、离相机太远、在画面中占比太小角点只有两三个像素检测器很难稳定找到。反光和强光阴影也会让灰度阈值失效。解决先从代码里把棋盘规格确认对。打印后把标定板贴在硬纸板或亚克力板上保持表面平整。拍摄时让标定板在画面中至少占三分之一面积不要追求“拍到整个场景”。光照尽量均匀避免直射灯光在纸面上形成高光。检测时加上CALIB_CB_ADAPTIVE_THRESH和CALIB_CB_NORMALIZE_IMAGE两个flag很多光照问题的第一道防线就靠它们。提示每帧检测成功后把chessboard角点画出来存一份图。角点连线如果有交叉跳线说明有误检这帧不能用别舍不得删。5.2 双目标定RMS大基线长度也对不上现象stereoCalibrate返回的rms到了1.5甚至2.0以上T的模长和实际尺子量出的距离差出15%以上换一组图像对结果又变。原因左右两张图不是同一时刻采集的。用手拿着标定板移动时左右相机各自调曝光帧率不一致导致某一帧左右图里的标定板位置有细微偏差三角关系被破坏。另一个常见原因是混入了模糊帧手持标定板移动速度稍快画面中棋盘格边缘拖影亚像素角点位置偏移整体误差被放大。解决把相机固定人拿着标定板停在某个位置拍一帧再移到下一个位置而不是一边移动一边连拍。采集时先把左右相机的曝光和白平衡固定成手动模式避免两边的亮度差异过大。每条记录在保存时同时画角点图模糊的就地删除。标定前先跑一遍单目标定把每张图的单目重投影误差打印出来单目都过不了关的帧直接不参与双目标定。5.3 SGBM视差图大面积空洞或者横向条纹现象视差图里物体表面出现大量黑色区域或者有规律的横向亮暗条纹边界部分出现“光圈状”错误。原因物体表面纹理太弱比如纯色纸盒、白墙匹配算法找不到足够区分度的灰度变化代价函数一片平坦唯一性约束把结果全判为无效。横向条纹一般来自光照不均匀或左右图亮度不一致。SGBM的匹配代价对光照差异敏感左边亮右边暗的区域很容易得到错误视差。解决先调低uniquenessRatio把它从10降到5无效区域通常会明显减少。再适当加大blockSize从5调到11匹配窗口变大后低纹理区域更容易找到可靠对应。注意blockSize太大会让物体边缘膨胀一圈测量尺寸随之偏大。如果左右图亮度差异明显可以在remap之后先做一下直方图匹配或者分块归一化。还有一种做法是把两幅图转到Lab空间只用L通道匹配对光照变化有缓解。5.4 测量距离一换误差就翻倍甚至出现离谱值现象0.6米处测一个标准量块误差不到1毫米换到1.2米处误差变成5毫米再远一点直接测出负数或零。原因这不是代码bug而是物理规律。前面说过δZ ≈ Z²/(f×B)×δd距离加倍深度误差约是平方关系放大。同时距离变远后物体在画面里占据像素变少视差本身变小1个像素的视差误差带来的相对误差更严重。很多SGBM参数是在近处调的远距离下匹配信噪比变差因此空洞和误匹配会更多。解决先确定这套系统的工作距离区间不要指望一台相机配置覆盖所有距离。如果设计目标就是0.5到1米那么标定、调参、精度验证都控制在这个区间内。在点云上做尺寸计算之前用深度中位数把明显偏离的离群点剔除避免个别错误匹配把极差撑大。测量时取多次结果的单位数——这点很重要——比均值更抗离群值干扰。如果一定要拉长工作距离优先考虑加大基线或者提高图像分辨率而不是继续调SGBM参数参数只能修噪声修不了系统设计缺口。5.5 OpenCV环境问题cv2导入失败或装完找不到模块现象终端执行python后import cv2报ModuleNotFoundError: No module named cv2。或者在Anaconda Prompt里明明装了opencvVSCode一运行又报同样的错安装完opencv-contrib-python后原有的opencv-python功能出现异常。原因绝大多数是Python环境错乱。pip装进了某个Python解释器的site-packages里而当前VSCode或终端用的解释器是另一个。还有人在base环境和conda环境里各装了一次代码运行时两个opencv版本被覆盖cv2的接口不兼容。解决统一用python -m pip install opencv-python指定当前解释器执行安装不要只敲pip。装完立刻执行python -c import cv2, sys; print(cv2.__version__); print(sys.executable)确认模块路径和解释器路径一致。用Anaconda的话先conda activate 你的环境再conda install opencv。VSCode里按CtrlShiftP选择“Python: Select Interpreter”选到同一个环境。opencv-python和opencv-contrib-python不要同时在同一个环境里安装前者已经包含常用模块后者带有扩展模块两个一起装容易出现头文件冲突。6. 精度验收和提精度的三个习惯让测量结果可复现视觉测量项目最怕的是“演示的时候准换一个场景就不准”。因此不要只贴一张成功的测量截图而要做一个可复现的精度验收流程。做法很简单找一个边长已知的标准量块或加工件用卡尺量出长宽高作为真值把它放在工作距离范围内测20次每次记录输出然后统计均值、标准差、最大偏差做一张对照表。这张表放在毕业设计文档里比任何代码片段都有说服力。三个能直接提升稳定性的习惯值得从第一天就养成。第一每次预处理都要保留中间结果图标定角点图、校正后图像、视差图、轮廓掩膜。出了问题可以快速定位是标定、匹配还是分割环节翻车而不是对着最终打印的尺寸发呆。第二所有标定文件和映射表统一保存成npz并带时间戳换相机、换镜头、改变分辨率后立刻重新标定不要沿用旧标定文件。USB摄像头在拔插后内部参数可能变化继续用旧参数测量的结果纯属玄学。第三测量计算时永远先做深度滤波再做极值求差三个点的离群值就可能让长宽高偏出好几毫米滤波后的极差才有参考价值。我现在每换一个环境拍摄都会先花十分钟拍一组标定板过一遍RMS确认无误再往下走。这套工序省掉的时间远超它本身花费的时间。如果后面你想拓展可以从两个方向入手一是把SGBM换成基于深度学习的匹配模型对低纹理物体改善明显二是加入姿态估计测得不仅是外接长方体尺寸还能输出物体在三维空间里的朝向。不过在此之前先把标定和视差质量稳定住。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

场景化定制

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

营销型架构

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

全周期服务

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

免费获取你的建站方案

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