我正在使用cv :: solvePnP获取相机姿势并使用该姿势在OpenGL窗口中投影3D模型的项目。
我使用this link从opencv内在和外在矩阵转换为opengl mvp矩阵。
当我放大对象时,投影似乎很好,如image所示,使用opengl投影会稍大:左边是相机看到的对象,右边是opengl投影给了我。
我想我会有完全相同的预测。是因为失真场还是在opengl中使用了错误的投影矩阵?
答案 0 :(得分:2)
源图像具有镜筒透镜畸变。这是图像的非线性失真,无法用投影矩阵描述。另一方面,OpenGL使用直线投影:将直线投影到直线上的投影。因此,它不能解决源图像中的镜头失真。
要正确解决此问题,您需要使用直线投影来渲染图像,然后使用镜头畸变系数使图像失真,您应该能够从OpenCV固有摄像机参数中检索出该畸变系数。这将需要渲染到纹理,然后在正确的坐标处从该纹理采样。有关详细信息,请参见Distortion on Wikipedia。