计算得到的Q矩阵中的cx cy f为什么与相机内参cameraMatrix中的cx cy f不同?

根本原因分析

(1) alpha 参数的作用
您设置的 alpha = -0.5 触发了以下行为:

alpha < 0:OpenCV 会 自动缩放和移动内参,生成一个“最优”的校正映射,可能导致:

焦距 f 被放大(超出原始值)

主点 cx, cy 偏移(可能超出图像边界)

目的:最大化有效视野(validRoi),但会牺牲内参的物理意义。

(2) CALIB_NINTRINSIC 标志
此标志告诉 OpenCV 不优化内参,但立体校正过程仍会根据 alpha 调整投影矩阵 P1/P2 和 Q 矩阵中的参数,导致与原始内参不一致。

(3) 分辨率与内参的冲突
若原始 cameraMatrix 中的 cx, cy 已接近图像边界(如 cx=296.8 对于宽度 424),校正后的主点可能被推到图像外。

alpha = 0或者alpha = 1还是会改变cx cy f, 与内参求得数值不同,这是为什么??

image

措施

image

使用校正后的相机坐标与校正后的虚拟内参、计算得到uv

// 在调用 stereoRectify 后,覆盖 Q 矩阵的 cx, cy, f
Mat Q;
stereoRectify(..., Q); // 原始调用

// 强制使用原始内参
Q.at(0, 3) = -cameraMatrix[0].at(0, 2); // -cx
Q.at(1, 3) = -cameraMatrix[0].at(1, 2); // -cy
Q.at(2, 3) = cameraMatrix[0].at(0, 0); // fx

image

posted @ 2025-07-16 16:42  aisuanfa  阅读(25)  评论(0)    收藏  举报