opencv - 立体校准后将相机 1 图像中的 2d 点投影到相机 2 图像

标签 opencv 2d computer-vision camera-calibration stereo-3d

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

我尝试了将 2d 点从 [x,y] 转换为 [x,y,1] 的天真方法,乘以 3x3 旋转矩阵,加上旋转向量,然后除以 z,但结果是错误的, 所以我想事情没那么简单 (?)

编辑(澄清一些事情):

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

这是我的设置:

setup

我有与两个相机 (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 并绘制它们。

有新的会更新

最佳答案

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

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

关于opencv - 立体校准后将相机 1 图像中的 2d 点投影到相机 2 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11998564/

相关文章:

opencv - 仅通过图像而不是通过标签从数据库中查找相似图像

algorithm - 如何找到一组线的最小边界矩形?

java - 二维数组单词搜索

c++ - 计算二维平面中黑白形状的大小

c++ - 使用 OpenCV 从电视 USB 调谐器访问流

geometry - 2D几何: how to check if a point is inside an angle

python - 在图像上网格以计算平均颜色

c++ - 将检测到的文本设置为比图像暗 - ccv

python - 使用 ssd_mobilenet_v2_quantized_300x300_coco 的对象检测模型的丢失在每 10k-12k 步后增加

python - 识别数组中的数字组(图像的组像素)