为什么模型的 opengl 投影没有给出与 opencv 投影完全相同的结果?

Why is the opengl projection of a model not giving the exact same results as the opencv projection?

我正在做一个项目,我使用 cv::solvePnP 获取相机姿势并使用此姿势在 OpenGL 中投影 3D 模型 window。

我使用 this link 从 opencv 内部和外部矩阵到 opengl mvp 矩阵。

当我放大物体时投影似乎很好,用opengl它稍微大一点,如image所示:左边是用相机看到的物体,右边是opengl 投影给了我什么。

我以为我会有完全相同的投影。是因为失真场还是我在opengl中使用了错误的投影矩阵?

源图像有桶形镜头畸变。这是无法用投影矩阵描述的 non-linear 图像失真。另一方面,OpenGL 使用 直线投影 :将直线投影到直线上。所以它无法解释源图像中的镜头失真。

要正确解决此问题,您需要使用直线投影渲染图像,然后使用镜头畸变系数对其进行畸变,您应该能够从 OpenCV 固有相机参数中检索到该系数。这将需要渲染到纹理,然后在正确的坐标处从该纹理采样。有关详细信息,请参阅 Distortion on Wikipedia