5

我正在使用 opencv 对两个相机(我们将它们命名为 L 和 R)进行立体校准。我使用 20 对棋盘图像并计算 R 相对于 L 的变换。我想要做的是使用一对新图像,计算图像 L 中的 2d 棋盘角,根据我的校准变换这些点并绘制图像 R 上的相应变换点,希望它们与该图像中棋盘的角相匹配。

我尝试了将 2d 点从 [x,y] 转换为 [x,y,1] 的朴素方式,乘以 3x3 旋转矩阵,加上旋转向量然后除以 z,但结果是错误的,所以我猜猜这不是那么简单(?)

编辑(澄清一些事情):

我想这样做的原因基本上是因为我想在一对新图像上验证立体校准。所以,我实际上并不想在两个图像之间获得新的 2d 转换,我想检查我找到的 3d 转换是否正确。

这是我的设置:

设置

我有与两个摄像机(E)相关的旋转和平移,但我没有相对于每个摄像机(E_R,E_L)的对象的旋转和平移。

理想情况下我想做的是:

  1. 从相机 L 中选择图像中的二维角(以像素为单位,例如 [100,200] 等)。
  2. 根据我找到的矩阵 E对二维点进行某种转换。
  3. 从相机 R 获取图像中相应的 2d 点,绘制它们,希望它们与实际角点匹配!

不过,我想得越多,我就越相信这是错误的/无法做到。

我现在可能正在尝试的事情:

  1. 使用相机的内在参数(比如说 I_R 和 I_L),求解 2 个最小二乘系统以找到 E_R 和 E_L
  2. 从相机 L 中选择图像中的 2d 角。
  3. 将这些角投影到相应的 3d 点 (3d_points_L)。
  4. 做:3d_points_R = (E_L).inverse * E * E_R * 3d_points_L
  5. 从 3d_points_R 获取 2d_points_R 并绘制它们。

当我有新东西时我会更新

4

1 回答 1

2

这实际上很容易做到,但是你犯了几个错误。请记住,在立体校准后,R 和 L 将第二台摄像机的位置和方向与第一台摄像机的 3D 坐标系中的第一台摄像机相关联。并且还记得通过您需要三角定位位置的一对相机找到一个点的 3D 位置。通过将 z 分量设置为 1,您会犯两个错误。首先,您很可能使用了常见的 OpenCV 立体校准代码,并给出了棋盘角之间的距离(以厘米为单位)。因此,z=1 表示距离相机中心 1 厘米,即离相机超近。其次,通过为您所说的棋盘垂直于主轴(又称光轴或主射线)的所有点设置相同的 z,虽然在您的形象中很可能并非如此。因此,您首先将一些虚拟 3D 点转换为第二台摄像机的坐标系,然后将它们投影到图像平面上。

如果您只想转换平面点,那么您可以找到两个相机之间的单应性(OpenCV 具有该功能)并使用它。

于 2012-08-17T10:47:29.867 回答