【发布时间】:2015-10-12 01:24:39
【问题描述】:
您如何确定您在 X 时间为相机计算的内在和外在参数在 Y 时间仍然有效?
我的想法是
- 使用已知的校准对象(棋盘)并在时间 Y 将其放置在相机的视野中。
- 计算相机图像中的棋盘角点(时间 Y)。
- 将其中一个棋盘角点定义为世界原点,并根据该原点计算所有剩余棋盘角的世界坐标。
- 将 3. 的坐标与相机坐标系关联起来。
- 使用X时刻计算的参数,计算4点的图像点数。
- 从 2. 开始计算点与从 5 开始的点之间的距离。
这是一个聪明的方法吗?我最终想在 MATLAB 中实现它,然后可能在 openCV 中实现它。我想我知道如何执行步骤 1)-2) 和步骤 6)。也许有人可以为步骤2)-5)提供一个粗略的实现。特别是我不确定如何将“棋盘世界坐标系”与“相机世界坐标系”联系起来,我相信我必须这样做。
谢谢!
【问题讨论】:
-
整件事听起来很对。基本上你所说的是你将重新校准相机并检查新校准是否与旧校准大致相同。然而,我是一个单一的相机系统,“唯一会改变校准的东西”是 a) 改变相机的焦点 b) 改变相机的位置。如果相机“未触及”,则无需重新校准。
-
嗯,我希望可以避免整个“重新校准”,并且可以更轻松地完成验证步骤(例如,使用更少的图像)。是的,验证步骤的原因是,相机可能会轻微移动,我想知道在移动之后校准是否仍然有效。
-
取决于您想要的精度,但一般情况下,您需要在移动时重新校准。我想一个好方法是先检测棋盘的所有角落。然后选择 4 个相邻的点(在一个角落更好,因此误差传播得更多),然后用您的参数估计其余点。您可以得到所见和估计之间的误差。
-
这听起来很像我写的,我相信。但是,您选择相邻的点,而我只取了一个。为什么是 4 个(为什么是相邻的)?
-
如果你想“估计”平面上的点,你需要知道在哪个平面上。因此 4 个(实际上只需要 3 个)点。然后,使用校准参数估计由这些点形成的平面中的点,这些点在棋盘正方形长度的距离处。点越远,误差越大(尝试不扭曲图像并计算相邻像素的差异,几乎没有!)。因此,最好在某个角落取点,让误差尽可能大(否则它可以是 0.001,即使在未校准的东西中)
标签: matlab opencv camera camera-calibration matlab-cvst