假设我有给定数量的
n
具有已知内在特性的相机。每个摄像机都是同步的,每个摄像机都检测到具有旋转和移动的校准目标的t
帧,每个摄像机同时看到。
对于每一帧,我都有一些
objp, imgp
,其中imgp
是校准目标的检测点。我用它们来计算外在函数 [R|t]
(使用 cv2.solvePnP
。)
如何对所有这些数据进行平均?如果我理解正确的话,我不能简单地对
cv2.solvePnP
的原始结果进行四元数平均和平移平均,因为 - 当目标旋转和移动时 - 参考系将会不同。
我尝试先更改参考系,如下所示:
def get_extrinsics_fixed_to_global_reference(R_ref, t_ref, R_other, t_other):
# Get the extrinsics of the other camera in the reference camera's coordinate system
R = R_other @ R_ref.T
t = t_other - R @ t_ref
return R, t
但是我得到了垃圾结果。我目前正在使用带有
n = 2
相机的设置。
编辑:为了澄清,我的想法是本质上比较
cam_0
和 cam_k
的坐标系之间的转换结果。对于每组框架(对应于以特定方式倾斜的校准目标),我将得到一组所述变换(k > 0
),并且它们在理论上应该是相同的 - 这是我平均旋转矩阵的地方然后最终得到外在因素。 注意:我已经知道每个相机的内在特性。编辑2:我想我已经修复了它,下面是我的意思的可视化:
。一般来说,它们不是,而是系统的部分。 就您而言,您提到的统计数据是某种“平均值”,并且该系统是经过校准的多摄像头装备和相关软件
提高相机外部校准精度的直接方法不是对部分数据集计算的校准进行平均。相反,它是将您收集的所有数据合并到一个数据集中,并对其进行校准,然后运行全局捆绑调整程序。请参阅,了解更多信息:
旧但仍然很好:
Bill Triggs 捆绑调整审查