- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在带有两个摄像头的多 View 场景中使用 C++ 中的 open cv。我有两个相机的内在和外在参数。
我想将 View 1 中的 (X,Y) 点映射到第二个 View 中的同一点。我有点不确定我应该如何使用内在矩阵和外在矩阵来将点转换为 3D 世界并最终以新的 2D View 2 点结束。
最佳答案
(通常)不可能在没有一些附加信息的情况下获取一幅图像中的 2D 坐标并将其映射到另一个 2D 坐标。
主要问题是左侧图像中的单个点将映射到右侧图像中的一条线(对极线)。因为深度是一个自由参数,所以有无数个可能的对应位置。其次,完全有可能在正确的图像中不存在点,即它被遮挡了。最后,可能很难准确确定哪个点是正确的对应关系,例如如果场景中没有纹理或包含大量重复特征。
尽管基本矩阵(无论如何从 cv::StereoCalibrate
中得到)为您提供了每个相机中点之间的约束:x'Fx = 0
,对于一个给定的 x'
将会有一个完整的 x
族满足方程。
一些可能的解决方案如下:
您知道一幅图像中 2D 点的 3D 位置。如果 3D 点在一个公共(public)坐标系中,您只需将 cv::projectPoints
与您要投影到的其他相机的校准参数一起使用。
您使用 SIFT 或 ORB 等工具进行一些稀疏特征检测和匹配。然后您可以计算单应性以将点从一个图像映射到另一个图像。这对事物是平面做出了一些假设。如果你谷歌全景单应性,有很多讲座幻灯片详细介绍了这一点。
您校准相机,执行极线校正(cv::StereoRectify
、cv::initUndistortRectifyMap
、cv::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/
我在 Java 中遇到异常处理问题,这是我的代码。当我尝试运行此行时出现编译器错误:throw new MojException("Bledne dane");。错误是: exception MojE
我刚刚开始学习asp.net。在你们的支持下,我希望我能从这个论坛学到更多东西。 我的问题是, 我在 asp.net 页面中有一个 TabContainer1,因为每个选项卡面板中有多个类似 (60)
我是一名优秀的程序员,十分优秀!