gpt4 book ai didi

opencv - 将一个摄像机 View 中的 2D 点投影到同一场景的另一个摄像机 View 中的相应 2D 点

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:51 26 4
gpt4 key购买 nike

我在带有两个摄像头的多 View 场景中使用 C++ 中的 open cv。我有两个相机的内在和外在参数。

我想将 View 1 中的 (X,Y) 点映射到第二个 View 中的同一点。我有点不确定我应该如何使用内在矩阵和外在矩阵来将点转换为 3D 世界并最终以新的 2D View 2 点结束。

最佳答案

(通常)不可能在没有一些附加信息的情况下获取一幅图像中的 2D 坐标并将其映射到另一个 2D 坐标。

主要问题是左侧图像中的单个点将映射到右侧图像中的一条线(对极线)。因为深度是一个自由参数,所以有无数个可能的对应位置。其次,完全有可能在正确的图像中不存在点,即它被遮挡了。最后,可能很难准确确定哪个点是正确的对应关系,例如如果场景中没有纹理或包含大量重复特征。

尽管基本矩阵(无论如何从 cv::StereoCalibrate 中得到)为您提供了每个相机中点之间的约束:x'Fx = 0,对于一个给定的 x' 将会有一个完整的 x 族满足方程。

一些可能的解决方案如下:

  1. 您知道一幅图像中 2D 点的 3D 位置。如果 3D 点在一个公共(public)坐标系中,您只需将 cv::projectPoints 与您要投影到的其他相机的校准参数一起使用。

  2. 您使用 SIFT 或 ORB 等工具进行一些稀疏特征检测和匹配。然后您可以计算单应性以将点从一个图像映射到另一个图像。这对事物是平面做出了一些假设。如果你谷歌全景单应性,有很多讲座幻灯片详细介绍了这一点。

  3. 您校准相机,执行极线校正(cv::StereoRectifycv::initUndistortRectifyMapcv::remap) 然后通过立体匹配器运行它们。输出是一个视差图,它可以准确地提供您想要的东西:从一个摄像头到另一个摄像头的逐像素映射。也就是说,left[y,x] = right[y, x+disparity_map[y,x]]

(1) 是迄今为止最简单的,但您不太可能已经掌握了该信息。 (2) 通常是可行的并且可能是合适的,并且正如另一位评论者指出的那样,在平面性假设失败的情况下会很差。 (3) 是一般(理想)解决方案,但有其自身的缺点并且依赖于适合密集匹配的图像。

关于opencv - 将一个摄像机 View 中的 2D 点投影到同一场景的另一个摄像机 View 中的相应 2D 点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29351998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com