我想将3D空间中的一个点投影到2D图像坐标中。我有我正在使用的相机的校准内在函数和外在函数。我有相机矩阵K和失真系数D.但是,我希望投影的图像坐标是未失真的图像。
根据我的研究,我发现了两种方法。
使用opencv的getOptimalNewCameraMatrix
函数计算新的未失真图像的相机矩阵K'。然后在opencv的projectPoints
函数中使用此K',将失真参数设置为0
,以获得投影点。
使用原始相机矩阵K使用projectPoints
功能,以及此功能中的失真系数D,并获得投影点。
两种方法的输出是否匹配?
答案 0 :(得分:2)
我认为你的思想中缺少一些东西。
相机矩阵K和dist。 coefficent D是进行不失真的参数(如果你的镜头像鱼眼一样扭曲图像)。它们就是所谓的内在相机参数。
如果我们将术语从计算机视觉更改为计算机图形,那么这些参数就是您用来定义视锥的平截头体的参数,例如,它们用于获取相机的焦距。
但他们还不足以做投影的事情。
对于投影,如果您在计算机图形术语中考虑(例如,像opengl),则需要使用模型 - 视图 - 投影矩阵。模型矩阵是指定对象在世界中的位置的矩阵。视图矩阵指定摄像机的位置,投影矩阵指定平截头体(焦角,透视畸变等)。
如果你想知道如何将模型的点从3d转换为2d(或反之亦然),你需要投影和视图矩阵(你有模型矩阵,因为你有你想要开始的3d点)。在计算机视觉中,视图矩阵称为外部参数。
所以,你也需要estrinsic参数,这是世界上相机的位置。也就是说,例如,这些参数是rvec
所需的tvec
和cv:: projectPoints
。
如果你想计算它们,它们正是cv::solvePnP
的输出,与你想做的完全相反:从一些已知的3d点加上相机屏幕上已知的2d投影,这个函数为你提供了一个外在的参数(通过cv::Rodrigues
,你可以从中获得一些opengl-opencv-augmented-reality-无论应用程序的视图矩阵。)
最后注意:虽然在用相机拍摄的所有照片中都固定了内部参数(当然你没有改变焦距),每次移动相机时,estrinisc参数都会改变,以便拍摄新照片从不同的角度来看(也就是说:这改变了视角,所以想要找到的3D-2D投影)
希望可以提供帮助!