从 OpenGL 到 OpenCV 的转换

Conversion from OpenGL to OpenCV

我有什么

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

方法

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

编辑

unity中无法使用正交相机

固定

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

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

我不能使用 unity 的正交相机,我会尝试从您的 link 打开的 CV 文档中的示例中模仿 c++ 代码。另一种方法可以是尝试通过乘以逆矩阵(该点的变换矩阵的逆)来获得要删除投影的点的投影矩阵。矩阵乘以它的逆矩阵就是恒等式,因此投影变换将被删除。我认为这应该是可能的,你可以深入了解你可以 obtain/change 投影矩阵检查 this。重点是撤消投影变换。然后你需要获得相应的正交投影矩阵并应用它来获得你之后的位置。这应该和unity的正交相机做的一样。

把投影矩阵理解到最底层this源码真棒