我正在使用 opencv 对两个相机(我们将它们命名为 L 和 R)进行立体校准。我使用 20 对棋盘图像并计算 R 相对于 L 的变换。我想做的是使用一对新图像,计算图像 L 中的二维棋盘角,根据我的校准变换这些点并绘制图像 R 上相应的变换点,希望它们与该图像中棋盘的角相匹配。
我尝试了将 2d 点从 [x,y] 转换为 [x,y,1] 的天真方法,乘以 3x3 旋转矩阵,加上旋转向量,然后除以 z,但结果是错误的, 所以我想事情没那么简单 (?)
编辑(澄清一些事情):
我想这样做的原因基本上是因为我想验证一对新图像的立体校准。所以,我实际上并不想在两个图像之间进行新的 2d 转换,我想检查我找到的 3d 转换是否正确。
这是我的设置:
我有与两个相机 (E) 相关的旋转和平移,但我没有与每个相机 (E_R, E_L) 相关的对象的旋转和平移。
理想情况下我想做的事情:
- 选择来自相机 L 的图像中的二维角(以像素为单位,例如 [100,200] 等)。
- 根据我找到的矩阵 E,对二维点进行某种变换。
- 从相机 R 获取图像中相应的 2d 点,绘制它们,希望它们与实际角点匹配!
虽然我越想越觉得这是错误的/不能做的。
我现在可能正在尝试的是:
- 使用相机的固有参数(比如 I_R 和 I_L),求解 2 个最小二乘系统以找到 E_R 和 E_L
- 在来自相机 L 的图像中选择 2d 个角点。
- 将这些角投影到相应的 3d 点 (3d_points_L)。
- 做:3d_points_R = (E_L).inverse * E * E_R * 3d_points_L
- 从 3d_points_R 获取 2d_points_R 并绘制它们。
有新的会更新
最佳答案
这实际上很容易做到,但是您犯了几个错误。请记住,在立体校准后,R 和 L 将第二台摄像机的位置和方向与第一台摄像机的 3D 坐标系中的第一台摄像机相关联。还要记住通过一对相机找到一个点的 3D 位置,你需要对位置进行三角测量。通过将 z 组件设置为 1,您犯了两个错误。首先,您很可能使用了常见的 OpenCV 立体校准代码,并给出了以厘米为单位的棋盘角之间的距离。因此,z=1 表示距相机中心 1 厘米,距离相机非常近。其次,通过为您所说的棋盘垂直于主轴(也称为光轴或主光线)的所有点设置相同的 z,而在您的图像中很可能并非如此。因此,您首先将一些虚拟 3D 点转换到第二台摄像机的坐标系,然后将它们投影到图像平面上。
如果你只想变换平面点,那么你可以找到两个相机之间的单应性(OpenCV 有这个功能)并使用它。
关于opencv - 立体校准后将相机 1 图像中的 2d 点投影到相机 2 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11998564/