该算子是Halcon 双目相机标定核心算子本质是联合优化求解左右相机内参、畸变、相对位姿、全局位姿基于针孔相机模型 透镜畸变 光束平差法 (Bundle Adjustment, BA)实现全局最小二乘优化。先说结论binocular_calibration 的本质 张正友→单应矩阵→DLT→PnP→SE(3)→BA→Jacobians→双目校正 Bouguet Stereo Calibration Bundle Adjustment LM 优化一、binocular_calibration算子binocular_calibration ( X, Y, Z, // 世界坐标系 3D 标定点 (Xw,Yw,Zw) RowsL, ColsL, // 左图观测像素坐标 (v_L, u_L) RowsR, ColsR, // 右图观测像素坐标 (v_R, u_R) StartCamParL, // 左相机初始内参畸变 [f,k1,k2,k3,p1,p2,cx,cy,sx,sy] StartCamParR, // 右相机初始内参畸变 StartPosesL, // 左相机所有姿态初始 (R,t) StartPosesR, // 右相机所有姿态初始 (R,t) all, // 优化模式all 同时优化 内参畸变所有位姿双目外参 输出 CamParamL, // 输出优化后左相机完整参数 CamParamR, // 输出优化后右相机完整参数 NFinalPoseL, // 输出所有左相机最终位姿 (R,t) NFinalPoseR, // 输出所有右相机最终位姿 cLPcR, // 输出右相机相对左相机的外参 (R_LR, t_LR) Errors // 输出整体平均重投影误差(像素) )binocular_calibration流程实际上求的是左右内参外参 R t二、Bouguet思想0、对极几何1. 对极面Epipolar Plane对极面就是由下面三个元素共同决定的唯一一个平面左相机光心 O1右相机光心 O2空间点 P也就是说2. 对极线Epipolar Line对极面分别与左右像平面相交3. 对极点Epipole基线 O1​O2​会穿过两个像平面。因此得到两个交点左图 e1右图 e2它们就是另一台相机光心投影到本图像上的位置。所以左图中的e1是右相机中心 O2在左图像上的投影。右图中的e2是左相机中心 O1 在右图像上的投影。4. 图中各个点的关系空间点 P经过两台相机投影得到左图 P-pl右图 P-pr并且pl 一定落在左对极线上l1pr 一定落在右对极线 l2上。1、为什么要做立体矫正原始双目现状普通双目相机安装后很难做到严格平行左右相机光轴不平行、成像平面不共面极线是倾斜斜线找匹配点需要在整张图 / 斜线上搜索速度慢、误匹配多校正目标统一目标把任意姿态的双目变换成理想平行双目两相机光轴平行、成像面共面所有极线变为水平线匹配点一定在同一行匹配只需要一维同行搜索。Bouguet 是已标定双目的经典校正算法也是 OpenCV 默认实现最大特点让两张图的旋转畸变最小。硬件要求双目系统那我们需要求解什么东西呢1、左右相机内参这个是我们已经优化过的内参这个在之前也是输入2、双目外参右相机坐标系相对于左相机2、Bouguet 核心思想1、Bouguet解决了什么问题左右图像中的极线不是水平的。例如左图一点对应右图中的点那么就要满足 这个是很重要的从本质矩阵到基础矩阵F完整推导 -CSDN博客可以看本质矩阵E和基础矩阵F的推导过程2、Bouguet 的思想构造两个新的虚拟相机使左右两个像平面共面并且极线水平。也就是把两个相机旋转到一个新的坐标系。已知右相机相对左相机的旋转R和平移 t基线先构造一个全局旋转把基线方向强行转到水平 X 轴让极线变水平再把左右相机之间的相对旋转 **** 平均拆分左转一半、右转一半最终两相机相对旋转完全抵消、光轴平行同时单张图像旋转角度最小画面变形最少。分层拆解 3 个关键思路a、对齐基线-极线水平双目极线倾斜的根源是基线两相机光心连线不是水平的。 Bouguet 第一步构造旋转矩阵将基线向量旋转到标准坐标系的 X 轴极点被推到无穷远极线自然全部变成水平线。b、平分相对旋转 → 最小图像畸变假设左右相机原本有一个整体相对旋转 R。若只让右相机单独旋转抵消 R右图旋转角度大画面扭曲、边缘裁剪严重若只让左相机旋转抵消 R左图扭曲严重Bouguet 方案把总旋转R拆成两半 R^1/2左相机反向转半角右相机正向转半角。 两图旋转幅度一致且最小这是该算法最核心的优势c、组合两次旋转 → 得到最终校正姿态将「基线对齐旋转」和「半旋转补偿」结合分别得到左、右相机的最终校正旋转再结合相机内参完成像素重映射3、分步原理几何 数学约定以左相机坐标系为基准R右相机相对左相机的旋转矩阵t右相机相对左相机的平移向量基线向量步骤 1构造基线齐旋转矩阵核心目的让基线沿 X 轴极线水平。 构建一组右手正交坐标系 [r1,r2,r3]1、新X轴单位化基线把两相机光心连线作为新X轴两个相机连线方向。2、确定新的 z 轴3、计算新的 y 轴4、重新计算 z步骤 2拆分相对旋转核心平分旋转两相机原本存在相对旋转R会导致光轴不平行。旋转矩阵可以分解为旋转轴 旋转角对总旋转求半旋转旋转角度变为原来 1/2旋转轴不变反向半旋转。步骤 3计算左右相机最终校正旋转左相机校正旋转R_L Rrect *右相机校正旋转R_R Rrect *几何解释先统一做R_rect基线拉平极线水平左相机反向转半角右相机正向转半角两者叠加后原始相对旋转完全消失光轴严格平行每一张图只转了「总旋转的一半」畸变、拉伸、黑边最小。步骤 4图像重映射工程落地有了校正旋转 相机内参 K 畸变系数对每个像素做原图像素 → 相机归一化坐标 → 乘校正旋转 → 重投影到校正图像 → 插值填充。 最终输出极线同行的校正图总结Bouguet 立体校正 基线拉平让极线水平 旋转平分让图像形变最小OpenCV 中stereoCalibratestereoRectify即为Bouguet 方法// 输入内外参、畸变系数、图像尺寸 stereoRectify(K1, D1, K2, D2, imgSize, R, t, R1, R2, P1, P2, Q);三、基础数学模型1. 针孔相机 径向畸变模型Halcon 标准模型Halcon 相机内参CamPar [f, k1, k2, k3, p1, p2, cx, cy, sx, sy]世界坐标系 → 相机坐标系相机坐标系 → 归一化图像坐标透镜畸变矫正径向 切向畸变归一化坐标 → 像素坐标最终投影2、重投影误差优化目标函数3、双目外参cLPcR的数学意义4、binocular_calibration 对应关系四、映射gen_binocular_rectification_map参数含义说明Image1/Image2左右原始双目图像输入仅用于获取图像尺寸不参与像素计算CameraParam1左相机内参 畸变参数Halcon 标准相机参数CamPar格式[fx​,fy​,cx​,cy​,k1​,k2​,k3​,p1​,p2​]CameraParam2右相机内参 畸变参数同左相机RelPose右相机相对左相机的位姿姿态HalconPose类型描述右相机在左相机坐标系下的 6 自由度位姿 (tx​,ty​,tz​,α,β,γ)RectifMap1/RectifMap2输出左右校正映射图核心输出存储「校正后坐标 → 原图坐标」的映射关系给map_image使用RectifCameraParam1/RectifCameraParam2输出校正后相机内参校正后平行双目模型的新内参RectifPose输出校正后双目相对位姿校正后理想平行双目姿态光轴平行、基线水平Method校正算法选择常用bouguet默认、推荐、hartleyWidth/Height校正后图像分辨率自定义输出图像尺寸可和原图一致或缩放重点Methodbouguet时完全沿用前文讲的Bouguet 立体校正数学框架1、畸变逆矫正去除原始镜头畸变根据输入畸变系数 D对 p做逆畸变映射得到无畸变归一化坐标。2、投影到原始图像像素坐标3、存储映射表将每一组 \u,v)到(u,v) 存入RectifMap1/RectifMap2支持后续插值。总结映射图 全像素反向投影 旋转 畸变矫正 的预计算结果。4、输出校正后参数RectifCameraParam1/2校正后平行双目统一内参RectifPose校正后理想双目位姿相对旋转为 0仅保留水平基线。运行结果现象校正前同一物理点在左右图纵坐标不一致极线倾斜校正后同一物理点纵坐标完全相等极线水平左右图像旋转幅度均等各 \(3^\circ\)图像形变、黑边最小。关键特性、差异与常见问题1.bouguetvshartley区别bouguet基于标定参数均分旋转图像畸变最小工业双目首选hartley基于基础矩阵无需精确标定无内参 / 位姿也可校正但图像扭曲大。