将相机1图像中的2D点投影到经过立体标定的相机2图像中

5
我正在使用opencv进行两个相机(我们称之为L和R)的立体校准。我使用20对棋盘图像,并计算R相对于L的变换。我想做的是使用一对新图像,在图像L中计算2D棋盘角点,根据我的校准转换这些点,并在图像R上绘制相应的变换点,希望它们能匹配该图像中的棋盘角点。
我尝试了一种简单的方法,将2D点从[x,y]转换为[x,y,1],乘以3x3旋转矩阵,加上旋转向量,然后除以z,但结果是错误的,所以我猜这不是那么简单(?)
编辑(澄清一些事情):
我想这样做的原因基本上是我想验证新图像的立体校准。因此,我实际上不想获得两个图像之间的新2D变换,我想检查我找到的3D变换是否正确。
这是我的设置:

setup

我有两个相机之间的旋转和平移关系(E),但是我没有物体在每个相机中的旋转和平移关系(E_R,E_L)。
理想情况下,我想做以下事情:
1. 从相机L中选择2D角落(以像素为单位,例如[100,200]等)。 2. 基于我找到的矩阵E,在2D点上执行某种变换。 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并绘制它们。

如果有新内容我会更新。


你是说你有旋转和平移矩阵来关联这两个图像,想要将它们合并吗?你需要将它们相乘,而不是相加。最终结果为[T]*[R]。此外,你的坐标是三维的吗?当你说除以z时,是指z还是齐次坐标中的第三个元素?如果你真的在使用三维变换来映射图像之间的关系,那么你可能还有一个相机矩阵,需要将其与之相乘才能得到图像中的坐标。 - Hammer
1个回答

2
这其实很容易,但是你犯了几个错误。记住,在立体校正之后,R和L将第二个摄像机的位置和方向与第一个摄像机在第一个摄像机的 3D 坐标系中相关联。还要记住,通过一对相机找到点的 3D 位置需要进行三角测量。将 z 分量设置为 1,你犯了两个错误。首先,很可能你已经使用了常见的 OpenCV 立体校正代码,并给出了棋盘格角落之间的距离(以厘米为单位)。因此,z=1 表示距离相机中心 1 厘米,这非常靠近相机。其次,通过为所有点设置相同的 z,你表明棋盘格垂直于主轴(也称为光轴或主光线),而在你的图像中很可能不是这种情况。因此,你正在将某些虚拟 3D 点先转换到第二个相机的坐标系,然后将它们投影到图像平面上。
如果只需要转换平面点,则可以找到两个摄像机之间的单应性变换(OpenCV 有该功能),然后使用它。

先生,立体标定后如何找到单应性矩阵? - ToughMind
@ToughMind 我知道一种常用的方法是这样的:http://www.diegm.uniud.it/fusiello/demo/rect/index.html 如果您有投影矩阵,但不想或无法使用对应点来估计单应性矩阵。 - fireant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接