从 OpenGL 到 OpenCV 的转换

问题描述

我有什么

我正在统一使用标准透视相机生成图像。相机瞄准地平面(统一为 xz 平面),请参见图像。因此,我需要移除透视图,以便所有裁剪行彼此平行。

方法

openCV 中的 warpPerspective() 函数可用于从图像中移除透视。所有信息都是已知的,例如视野、旋转、位置……因此我知道 3D 点如何映射到 2D 平面上,反之亦然。问题是 OpenCV 使用其他系统。在openCV中应该是一个3X3矩阵,单元的变换矩阵是一个4X4矩阵。两者之间有转换吗?还是我应该考虑其他策略?

编辑

我无法统一使用正交相机。

已修复

通过构建从相机原点穿过每个像素的光线并寻找与地平面的交点来解决该问题。在此之后,我在具有与原始图像相同分辨率的网格中离散地平面。映射到同一个单元格的点被累积

enter image description here

解决方法

我不能使用 unity 的正交相机,我会尝试从开放 CV 文档中链接的示例中模仿 C++ 代码。另一种方法可以是尝试通过乘以逆矩阵(该点的变换矩阵的逆矩阵)来获得要删除投影的点的投影矩阵。矩阵乘以其逆是恒等式,因此投影变换将被删除。我认为这应该是可能的,您可以深入了解您可以获得/更改投影矩阵检查this。关键是要撤消投影转换。然后你需要获得相应的 othographic 投影矩阵并应用它来获得你所追求的位置。这应该与 unity 的正交相机所做的相同。

了解最低级 this 源的投影矩阵很棒。

,

我认为在相机组件中,您只需要将投影从透视更改为正交:

enter image description here