尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

相机标定工具库:支持多模型与标定板,实现高精度双目视觉标定

相机标定工具库:支持多模型与标定板,实现高精度双目视觉标定 简介相机标定是计算机视觉中建立三维世界与二维图像映射关系的基础技术其核心原理是通过已知空间坐标的标定板求解相机的内参如焦距、主点和畸变参数。精确的标定是后续三维重建、视觉SLAM和立体匹配等技术得以实现的前提直接决定了视觉系统的测量与感知精度。在工程实践中面对不同的镜头如广角、鱼眼和多样的标定板如棋盘格、圆形网格、ArUco码需要灵活选用合适的相机模型如针孔模型、Kannala-Brandt模型和检测算法。本工具库正是针对这些痛点整合了从图像采集、特征检测到非线性优化的完整流水线尤其优化了双目标定中的全局捆绑调整流程能够一站式输出高精度的内外参及立体校正参数为机器人定位、三维重建等应用场景提供可靠的视觉感知基础。1. 项目概述一个多功能的相机标定工具库在计算机视觉和机器人领域无论是做三维重建、视觉SLAM还是立体匹配相机标定都是绕不开的第一步也是最关键的一步。它决定了你的视觉系统能否准确地理解三维世界到二维图像的映射关系。最近我在一个机器人定位项目中需要处理来自不同厂商、不同镜头包括鱼眼和广角的双目相机数据。市面上虽然有不少标定工具比如OpenCV的calibrateCamera、MATLAB的工具箱甚至一些商业软件但它们要么支持的相机模型有限要么对标定板的兼容性不够灵活要么就是流程繁琐难以集成到自动化流水线中。正是在这种需求驱动下我花了不少时间整合并优化了一个相机标定工具库。这个库的核心目标很明确一站式解决多种相机模型和多种标定板的标定问题尤其是为双目系统提供开箱即用的标定流程。它支持从经典的针孔模型到应对大畸变的Kannala-Brandt、MEI和Scaramuzza鱼眼模型标定板也从最普通的棋盘格扩展到了圆形网格、非对称圆形网格以及ArUco码板。这个工具库不是简单的API封装而是包含了从图像采集、角点检测、模型优化到结果可视化和评估的完整流水线并且提供了Python和C的双接口方便嵌入到不同的系统中。如果你正在为以下问题头疼那么这个工具库可能会成为你的得力助手手头有鱼眼相机但OpenCV标定结果不理想需要快速标定一个双目系统并获取高精度的内外参和立体校正参数项目中使用了一种特殊的标定板现有工具不支持或者你希望有一个统一的、可脚本化的标定流程来代替手动点击的GUI工具。接下来我就详细拆解这个工具库的设计思路、核心实现以及那些在文档里不会写的实操细节。2. 核心设计思路与方案选型2.1 为何要支持多种相机模型相机模型本质上是描述三维空间点投影到二维图像像素坐标的数学函数。最简单的针孔模型假设光线沿直线传播这对于小视场角、畸变较小的镜头是足够的。其内参矩阵K包含焦距fx, fy和主点cx, cy和径向、切向畸变系数[k1, k2, p1, p2, k3]已经成为了行业标准。然而当面对广角镜头、鱼眼镜头或者全景相机时针孔模型就力不从心了。光线在通过这类镜头时会产生极大的弯曲用简单的多项式畸变模型去拟合往往在图像边缘会产生巨大的重投影误差导致标定失败或精度急剧下降。这时就需要更专业的模型Kannala-Brandt模型这是一个基于球面投影的通用模型特别适合描述鱼眼镜头。它通过一个奇次多项式来描述入射角与成像半径的关系理论上可以模拟大多数鱼眼镜头的投影特性在学术界和工业界如一些车载环视系统应用广泛。MEI模型这是一个统一模型它用一个统一的公式同时描述了透视相机和鱼眼相机。其特点是在模型中加入了一个镜像参数ξ当ξ0时退化为针孔模型。这个模型在ORB-SLAM2等著名开源项目中用于鱼眼相机的支持。Scaramuzza模型这是一个基于泰勒展开的多项式模型最初为某些特定的鱼眼相机设计。它不直接使用畸变中心而是通过查找表或多项式来映射像素到单位球面上的方向在某些硬件上可能有直接支持。注意模型选择不是越高级越好。针孔模型参数少、优化稳定在畸变不大的情况下是首选。鱼眼模型虽然能拟合大畸变但参数更多优化时更容易陷入局部最优对初始值和标定数据质量要求更高。我们的工具库提供选择但需要使用者根据镜头特性判断。2.2 标定板多样性背后的考量标定板是提供已知三维空间坐标的“标尺”。不同的图案各有优劣棋盘格最经典检测算法成熟如OpenCV的findChessboardCorners角点定位可以达到亚像素精度。缺点是必须完全可见对遮挡敏感且黑白对比度在光照不均时可能影响检测。圆形网格圆形标志点通常中心为亮斑的检测对旋转不敏感且圆心定位精度高。但检测算法需要区分正反面圆形从任何角度看都是圆通常假设标定板是平面的。非对称圆形网格这是圆形网格的改进版。通过故意设置不对称的圆心排列使得算法能够唯一确定检测到的圆点阵列的ID和方向即使标定板被部分遮挡或只看到一部分也能进行正确的匹配。这大大提升了标定数据采集的鲁棒性。ArUco码板每个标记Marker都有唯一的ID。最大的优势是部分可见即可用。即使只能看到一个或几个ArUco码系统也能唯一确定这些码在板子上的确切位置。这对于相机视野有限、或者需要动态标定的场景如手持标定板极具价值。此外ArUco码的四个角点都可以用于定位提供了更多的观测点。在工具库中我们为每种标定板实现了对应的检测模块。例如对于棋盘格和圆形网格我们封装并优化了OpenCV的检测流程增加了自适应阈值等预处理以提高成功率。对于ArUco板我们实现了基于ArUco库的检测与ID解码并将多个Marker的角点统一到板子坐标系下。2.3 双目标定流程的整合单目标定确定每个相机的内部参数内参和畸变。双目标定在此基础上还需要确定两个相机之间的相对位置和姿态关系旋转矩阵R和平移向量t即外参。一个鲁棒的双目标定流程应该是分别单目标定使用左右相机的图像独立优化各自的内参和畸变。这为后续联合优化提供了良好的初始值。初始外参估计利用左右相机对同一时刻标定板的观测通过PnPPerspective-n-Point算法可以计算出左右相机相对于该标定板的位姿进而推导出相机间的初始R和t。全局捆绑调整这是提升精度的关键步骤。将左右相机所有时刻的图像角点观测、所有内参、所有时刻标定板相对于左相机或世界坐标系的位姿、以及左右相机间的外参全部放在一个大的非线性最小二乘问题中一起优化。这样可以利用所有观测数据的约束得到统计上最优的解。立体校正参数计算得到精确的双目外参后计算用于立体校正的旋转矩阵R1, R2将左右图像平面重投影到共面且行对齐的平面上这是后续立体匹配的前提。我们的工具库将以上步骤流水线化用户只需要提供左右相机同步采集的图像对目录即可一键完成所有步骤输出包括单目参数、双目外参、立体校正参数以及详细的重投影误差报告。3. 工具库核心模块详解与实操要点3.1 图像采集与预处理模块采集是标定质量的天花板。再好的算法也无法弥补糟糕的数据。采集建议数量与姿态至少需要15-20张不同姿态的标定板图像。标定板应覆盖整个视野的不同位置中心、四个角落、边缘并具有丰富的旋转角度偏航、俯仰、滚转。确保标定板在每张图像中都清晰可见。光照均匀、无强烈反光。避免标定板上有高光斑点这会导致角点检测失败或定位不准。焦距与对焦采集过程中相机焦距和对焦点必须固定。如果是自动对焦相机请锁定对焦或改为手动模式。双目同步对于双目标定左右相机的图像必须是在同一时刻采集的。硬件同步是最佳选择。如果无法硬件同步则需确保标定板在采集间隔内基本静止并通过时间戳进行软匹配。预处理实操 工具库内置了预处理管道但你也可以根据图像质量手动调整。# 示例预处理管道伪代码 raw_img cv2.imread(image_path) # 1. 去噪特别是高ISO图像 denoised cv2.fastNlMeansDenoisingColored(raw_img, None, 10, 10, 7, 21) # 2. 对比度增强如果图像整体偏暗或偏亮 lab cv2.cvtColor(denoised, cv2.COLOR_BGR2LAB) l, a, b cv2.split(lab) clahe cv2.createCLAHE(clipLimit3.0, tileGridSize(8,8)) l_eq clahe.apply(l) enhanced_lab cv2.merge((l_eq, a, b)) enhanced cv2.cvtColor(enhanced_lab, cv2.COLOR_LAB2BGR) # 3. 工具库内部会根据标定板类型自动转换为灰度图并进行检测实操心得对于棋盘格有时轻微的模糊反而有助于亚像素角点检测的迭代收敛。但对于圆形或ArUco码清晰的边缘至关重要。不要对所有图像无脑应用锐化。3.2 角点/特征检测模块这是标定流程中自动化程度最高但也最容易出错的环节。棋盘格检测我们使用了OpenCV的findChessboardCornersSB自OpenCV 4.5.1引入作为默认方法它比传统的findChessboardCorners更快更鲁棒尤其是在标定板部分遮挡或图案不规则时。检测到角点后会调用cornerSubPix进行亚像素精细化这里需要指定迭代终止条件如最大迭代次数30误差阈值0.001和搜索窗口大小如11x11。圆形网格检测使用findCirclesGrid。这里的关键参数是blobDetector我们配置了一个简单的斑点检测器来初步定位圆斑然后进行网格拟合。对于非对称圆形网格必须指定cv2.CALIB_CB_ASYMMETRIC_GRID标志并正确提供patternSize例如(4, 11)表示4列11行注意这里的行列指的是圆心的数量。ArUco码板检测首先使用aruco.DetectorParameters()创建检测器参数并适当调整adaptiveThreshWinSizeMin,adaptiveThreshWinSizeMax,adaptiveThreshConstant以适应不同的光照。使用aruco.detectMarkers检测图像中的所有ArUco码。工具库内部维护了一个标定板定义aruco.GridBoard其中包含了每个Marker的ID及其四个角点的三维坐标。通过aruco.refineDetectedMarkers可以进一步优化检测结果。最后将检测到的所有Marker的角点根据其ID映射到标定板的世界坐标系下形成用于标定的三维-二维点对。常见检测失败处理问题棋盘格检测不到但人眼可见。排查首先检查patternSize内部角点数比如8x6表示有8*6个内部角点是否设置正确。尝试调整findChessboardCornersSB的threshold参数默认125。如果图像有透视畸变可以尝试先进行粗略的透视变换矫正。问题圆形网格被误检为椭圆导致圆心定位偏差。排查确保相机镜头轴心尽量垂直于标定板平面。如果无法避免大角度可以考虑在标定板检测阶段就引入相机畸变模型进行反向畸变校正但这会形成循环依赖通常更简单的办法是采集更多正对视角的图像。3.3 相机模型与优化引擎这是工具库的数学核心。我们基于Ceres Solver或g2o可配置构建了非线性最小二乘优化问题。代价函数设计对于每一对观测到的图像角点p_ij第i张图像的第j个角点其对应的三维标定板点P_j。根据当前估计的相机内参K、畸变参数D、第i张图像的相机位姿[R_i | t_i]我们可以计算出该三维点的重投影p_ij project(K, D, R_i, t_i, P_j)。代价函数就是所有观测点的重投影误差的平方和min Σ || p_ij - p_ij ||^2。模型投影函数project函数根据选择的相机模型而不同。针孔模型先进行刚体变换再除以Z进行透视投影最后应用多项式畸变模型。Kannala-Brandt模型将点投影到单位球面计算入射角θ然后用多项式θ_d θ k1*θ^3 k2*θ^5 k3*θ^7 k4*θ^9计算畸变后的角度再映射到图像平面。MEI模型先将点投影到一个以ξ为参数的统一模型下再进行畸变校正。 工具库中每个模型都被实现为一个独立的C类重载了投影和反投影函数并提供了对Ceres自动求导AutoDiff的支持。参数化与约束旋转矩阵R在优化中使用四元数或旋转向量轴角表示以保证其正交性。对于焦距fx, fy我们有时会施加一个弱先验比如假设fx ≈ fy特别是对于像素是正方形的传感器。这可以通过在代价函数中添加一个额外的正则项实现λ * (fx - fy)^2其中λ是一个很小的权重如1e-4防止两者偏离太远。对于鱼眼模型其畸变参数数量多优化容易发散。一个好的策略是分阶段优化先固定畸变参数为0优化内参和位姿然后用得到的结果作为初始值放开所有参数一起优化。3.4 双目标定与立体校正外参初始估计在完成左右相机的单目标定后我们有了各自的内参和每张图像对应的标定板位姿[R_left_i, t_left_i]和[R_right_i, t_right_i]。对于第i对图像左右相机之间的变换可以近似计算为R_initial R_right_i * R_left_i.Tt_initial t_right_i - R_initial * t_left_i。对多对图像计算的结果取中值或均值作为初始外参。全局捆绑调整这是最耗资源但最精确的步骤。我们构建了一个包含所有参数的大规模优化问题优化变量左相机内参K_l右相机内参K_r左相机畸变D_l右相机畸变D_r左右相机间外参[R_lr | t_lr]以及每一帧标定板相对于左相机坐标系的位姿[R_i | t_i]。观测约束对于左相机的每个角点观测构成一个重投影误差项对于右相机的每个角点观测需要先利用标定板位姿[R_i | t_i]和外参[R_lr | t_lr]将点变换到右相机坐标系再计算重投影误差。这样所有观测共同约束了所有参数能得到全局一致的最优解。立体校正得到精确的R_lr和t_lr后目标是使左右图像平面共面且行对齐。我们使用Bouguet的算法其核心思想是将旋转矩阵R_lr平分左右相机各旋转一半使得两者的光轴平行。构造一个旋转矩阵R_rect使得新的坐标系基向量之一通常是X轴与基线方向平移向量t_lr的方向对齐从而实现行对齐。 最终我们得到左相机的校正旋转矩阵R1和右相机的R2以及新的投影矩阵P1和P2。在OpenCV中可以通过stereoRectify函数计算这些参数并生成用于initUndistortRectifyMap的映射表。4. 完整实操流程与参数解析假设我们有一个双目鱼眼相机系统并使用非对称圆形网格标定板。以下是使用本工具库的完整步骤。4.1 环境准备与数据采集安装依赖工具库核心依赖OpenCV (4.5)、Ceres Solver、Eigen。Python接口需要pybind11。# 示例安装命令Ubuntu sudo apt-get install libopencv-dev libeigen3-dev libceres-dev git clone 工具库地址 cd 工具库目录 mkdir build cd build cmake .. -DPYTHON_EXECUTABLE$(which python3) make -j8 sudo make install # 安装Python包 cd python pip install .打印标定板使用工具库提供的脚本生成一个PDF格式的(4,11)非对称圆形网格标定板并精确测量圆点间距例如square_size 0.025米即25毫米。用哑光纸打印并粘贴在平整的硬质板上。采集图像固定双目相机分别采集左右相机的图像序列。确保左右图像同步文件名可对应如left_001.jpg,right_001.jpg。采集约20-30对图像覆盖视野各个区域。将图像分别放入data/left/和data/right/文件夹。4.2 单目标定与模型选择我们使用Python接口进行演示。import calib_toolkit as ct import cv2, os # 1. 创建标定板对象 pattern ct.CalibrationPattern.create( pattern_typeASYMMETRIC_CIRCLES_GRID, pattern_size(4, 11), # 宽4个圆高11个圆 square_size0.025 # 单位米 ) # 2. 创建相机标定器选择Kannala-Brandt鱼眼模型 calib_left ct.MonoCalibrator( camera_modelKANNALA_BRANDT, # 模型选择 patternpattern ) calib_right ct.MonoCalibrator( camera_modelKANNALA_BRANDT, patternpattern ) # 3. 加载并处理左相机图像 left_image_dir data/left/ for fname in sorted(os.listdir(left_image_dir)): if fname.endswith((.jpg, .png)): img cv2.imread(os.path.join(left_image_dir, fname)) # 检测角点 success, corners calib_left.detect_pattern(img) if success: calib_left.add_image_data(img, corners) print(fLeft: Detected in {fname}) else: print(fLeft: Failed in {fname}) # 4. 运行标定 print(Calibrating left camera...) result_left calib_left.calibrate() print(fLeft RMS Error: {result_left.rms_error:.4f} pixels) print(fLeft Intrinsics:\n{result_left.intrinsics_matrix}) print(fLeft Distortion Coeffs: {result_left.distortion_coeffs}) # 对右相机重复步骤3和4关键参数解析camera_model可选PINHOLE,KANNALA_BRANDT,MEI,SCARAMUZZA。calibrate()函数内部会进行初始化内参基于图像尺寸和理想针孔模型猜测。初始化每张图像的位姿使用PnP。调用Ceres进行非线性优化。优化配置如最大迭代次数默认50、线性求解器类型DENSE_QR或SPARSE_NORMAL_CHOLESKY可以在CalibrationOptions中设置。result_left.rms_error重投影误差的均方根单位是像素。一般要求小于0.5像素0.3像素以内为优秀。如果误差过大需要检查标定板检测质量或模型是否合适。4.3 双目标定与立体校正# 1. 创建双目标定器传入已标定好的单目结果或直接使用图像对 stereo_calib ct.StereoCalibrator( patternpattern, camera_model_leftKANNALA_BRANDT, camera_model_rightKANNALA_BRANDT ) # 2. 加载同步的图像对 left_dir data/left/ right_dir data/right/ left_images sorted([f for f in os.listdir(left_dir) if f.endswith((.jpg, .png))]) right_images sorted([f for f in os.listdir(right_dir) if f.endswith((.jpg, .png))]) for l_fname, r_fname in zip(left_images, right_images): img_l cv2.imread(os.path.join(left_dir, l_fname)) img_r cv2.imread(os.path.join(right_dir, r_fname)) success_l, corners_l stereo_calib.detect_pattern_left(img_l) success_r, corners_r stereo_calib.detect_pattern_right(img_r) if success_l and success_r: stereo_calib.add_stereo_pair(img_l, corners_l, img_r, corners_r) print(fAdded pair: {l_fname}, {r_fname}) # 3. 运行双目标定包含全局BA print(Running stereo calibration...) stereo_result stereo_calib.calibrate() print(fStereo RMS Error: {stereo_result.rms_error:.4f} pixels) print(fRotation Matrix (R):\n{stereo_result.R}) print(fTranslation Vector (T):\n{stereo_result.T}) # T是一个3x1向量注意其方向通常从左到右 # 4. 计算立体校正参数 rectify_params stereo_calib.compute_rectification(stereo_result) # 5. 保存结果供后续使用 import json with open(stereo_calib_result.json, w) as f: json.dump({ K_left: stereo_result.K_left.tolist(), D_left: stereo_result.D_left.tolist(), K_right: stereo_result.K_right.tolist(), D_right: stereo_result.D_right.tolist(), R: stereo_result.R.tolist(), T: stereo_result.T.tolist(), R1: rectify_params.R1.tolist(), R2: rectify_params.R2.tolist(), P1: rectify_params.P1.tolist(), P2: rectify_params.P2.tolist(), Q: rectify_params.Q.tolist() # 视差转深度矩阵 }, f, indent2) # 6. 可视化校正效果 map1_l, map2_l cv2.initUndistortRectifyMap( stereo_result.K_left, stereo_result.D_left, rectify_params.R1, rectify_params.P1, (img_l.shape[1], img_l.shape[0]), cv2.CV_16SC2 ) # 同理生成右图的map1_r, map2_r # ... 使用remap函数校正图像并水平拼接显示检查行对齐效果双目外参解读stereo_result.T平移向量其物理意义是右相机原点在左相机坐标系中的坐标。通常双目相机是水平放置的所以T向量的第一个分量X方向的值最大这个值就是基线长度Baseline单位与标定板尺寸单位一致本例中是米。基线长度是后续立体视觉计算深度的重要参数。4.4 标定结果验证与评估标定完成后绝不能只看RMS误差就了事必须进行可视化验证。重投影误差可视化工具库应提供功能将标定板角点的重投影位置用优化后的参数计算得出用绿色圆圈画在原始图像上而检测到的原始角点用红色十字表示。肉眼观察误差分布是否均匀。如果误差在图像边缘明显增大可能说明相机模型仍不足以完美描述该镜头的畸变。畸变校正图使用标定出的内参和畸变系数对原始图像进行去畸变处理生成校正后的图像。观察直线物体如门框、桌子边缘是否被“拉直”。这是检验畸变标定效果最直观的方法。立体校正检查对左右图分别进行立体校正然后将校正后的图像上下或左右拼接。在理想情况下同一空间点在左右图中的纵坐标v坐标应该完全相同。你可以画一些水平线观察左右图中对应特征点是否严格位于同一水平线上。如果有明显的垂直视差说明校正不完美会影响立体匹配的精度。极线几何验证对于未校正的原始图像根据标定的基础矩阵F对于左图中的一个点可以在右图中画出对应的极线。该点在右图中的对应点应该落在这条极线上。随机选取一些明显的特征点进行验证。5. 常见问题排查与实战技巧在实际项目中标定过程很少一帆风顺。下面是我总结的一些典型问题及其解决方法。5.1 标定误差过大RMS 1.0 pixel可能原因1标定板检测不准。排查可视化每一张图像的角点检测结果检查是否有误检、漏检或定位偏差。特别是图像边缘的角点由于畸变严重亚像素迭代可能收敛到错误位置。解决尝试调整角点检测的参数如findChessboardCornersSB的阈值。对于圆形网格确保findCirclesGrid的blobDetector参数合适。剔除检测质量差的图像工具库应提供每个图像的单独重投影误差。可能原因2标定板尺寸输入错误。排查这是最隐蔽的错误square_size必须是标定板上相邻角点/圆心之间的实际物理距离。对于棋盘格是相邻内部角点的距离对于圆形网格是相邻圆心之间的距离。单位要一致米或毫米。解决用游标卡尺精确测量并确认。这个错误会导致计算出的焦距等内参物理单位错误但有时RMS误差看起来却不大因为它是一个相对误差。可能原因3相机模型选择不当。排查观察畸变校正图。如果图像边缘的直线仍然弯曲或者被过度校正向反方向弯曲说明模型不合适。解决尝试切换相机模型。对于超广角或鱼眼优先尝试KANNALA_BRANDT。也可以尝试在针孔模型中使用更高阶的畸变系数如k4, k5, k6但要注意过拟合风险。可能原因4优化陷入局部最优。排查检查初始化是否合理。工具库内部通常用DLT或PnP初始化位姿用图像中心初始化主点用图像宽度初始化焦距。解决尝试提供更好的初始值。例如如果你知道相机的近似焦距可以从传感器尺寸和焦距估算可以将其作为初始值传入优化器。对于双目标定可以先分别单目标定将其结果作为双目联合优化的初始值。5.2 双目外参标定结果不合理问题平移向量T的模长基线长度与实际测量的物理基线长度相差甚远。排查标定板尺寸单位确认单目标定中square_size的单位。如果单目标定用的是米那么T的单位也是米。检查计算出的基线长度例如0.2米是否与相机实际物理间距20厘米吻合。左右图像对应错误确保左右图像对是严格同步的。如果图像对错位会导致外参计算完全错误。可以通过观察左右图中标定板的位置是否大致匹配来初步判断。旋转矩阵R异常检查旋转矩阵。对于水平放置的双目相机R应该接近单位阵。如果出现了大的旋转可能是左右相机图像被错误地镜像或旋转了某些相机驱动会自动旋转图像。5.3 立体校正后行对齐效果差问题校正后的左右图像对应点不在同一行上存在垂直视差。排查与解决外参精度不足这是最主要的原因。垂直视差通常来源于外参中绕X轴上下和Z轴旋转的误差。需要重新检查双目标定的质量确保RMS误差足够小并且使用了全局捆绑调整而不是简单的初始估计。分别单目标定误差大如果左右相机各自的内参和畸变标定不准会直接影响外参估计和校正。确保左右相机单目标定的重投影误差都达标。尝试OpenCV的stereoCalibrate标志在调用stereoCalibrate或类似函数时可以尝试设置标志CV_CALIB_FIX_INTRINSIC。这意味着在双目标定中固定从单目标定得到的内参和畸变只优化外参。有时这能获得更稳定的外参但前提是单目标定必须非常准确。5.4 标定流程自动化集成技巧在工业应用中标定可能需要定期进行或集成到产线中。自动触发采集通过串口或网络协议控制相机和机械臂或转台让标定板以预设的轨迹运动自动完成多姿态图像采集。在线质量检测在采集每张图像后立即运行角点检测算法。如果检测失败或角点数量不足则自动重拍该姿态确保采集的数据集是“干净”的。参数持久化与版本管理将标定结果内参、外参、校正映射表以结构化的格式如JSON、YAML保存并附带时间戳、相机序列号、标定板信息、RMS误差等元数据。这对于追踪相机状态和问题回溯至关重要。设计鲁棒的标定板对于自动化环境强烈推荐使用非对称圆形网格或ArUco码板。它们对遮挡和部分可见的鲁棒性远超棋盘格可以降低采集阶段的失败率。最后再分享一个关于模型选择的个人体会不要盲目追求复杂的模型。我曾在一个项目中使用200度视场的鱼眼镜头最初直接上Kannala-Brandt模型结果优化不稳定。后来我先用针孔模型只使用图像中心区域的数据标定出一个粗糙的内参和位姿作为KB模型的初始值再使用全图数据进行优化结果收敛又快又好。所以好的初始值是成功的一半对于非线性优化问题尤其如此。这个工具库提供了灵活的模块但如何组合使用这些模块需要你根据具体的传感器和数据特点加入自己的思考和调试。本文还有配套的精品资源点击获取
返回列表