2013-06-21 32 views
0

我想将三维空间中的点投影到二维图像坐标中。我拥有我正在使用的相机的校准内在特性和外观。我有相机矩阵K和失真系数D.但是,我希望投影的图像坐标是未失真的图像。投影点到未失真图像上的一致性

从我的研究中,我找到了两种方法来做到这一点。

  1. 使用opencv的getOptimalNewCameraMatrix函数来计算新的未失真图像的相机矩阵K'。然后在opencv的projectPoints函数中使用此K',将失真参数设置为0,以获取投影点。

  2. 使用projectPoints函数使用原始摄像机矩阵K以及此函数中的失真系数D并获得投影点。

两种方法的输出是否匹配?

+0

什么新东西?它有帮助吗? – nkint

回答

2

我认为你的思想中有某种缺失。

相机矩阵K和dist。系数D是使失真保持不变的参数(如果镜头像鱼眼一样扭曲图像)。它们就是所谓的内在摄像机参数。

如果我们将术语从计算机视觉更改为计算机图形,那么这些参数就是用于定义视锥的那些参数,例如它们用于获取相机的焦距。

但他们不足以做投影的东西。

对于投影,如果您认为在计算机图形学术语(例如opengl)中需要模型视图投影矩阵。模型矩阵是指定对象在世界中的位置的矩阵。视图矩阵指定相机的位置,投影矩阵指定平截头体(焦点角度,透视失真等)。

如果您想知道如何将模型中的点从3d转换为2d(或反之亦然),您需要投影和视图矩阵(您有模型矩阵,因为您有要从中选择的3d点开始)。而在计算机视觉中,视图矩阵被称为estrinsic参数。

所以,你也需要estrinsic参数,也就是相机在世界上的位置。也就是说,例如,那些参数是cv:: projectPoints需要的rvectvec

如果你想计算它们,它们正好是cv::solvePnP的输出,它与你想要做的相反:从一些已知的3d点加上摄像机屏幕上已知的2D投影,该函数给出你的estrinsic参数(从中你可以通过cv::Rodrigues获得opengl-opencv-augmented-reality-any应用的视图矩阵)。

最后一点:虽然在用相机拍摄的所有照片中固定的内在参数是固定的(当然您并不改变焦距),但每次移动相机拍摄新照片时,estrinisc参数都会发生变化从不同的角度看图片(即:这改变了透视的角度,所以你想找到的3D-2D投影)

希望能帮上忙!