OpenCV:从翻译和旋转中获取透视矩阵

Dav*_*ave 12 opencv camera-calibration

我正在尝试验证我的相机校准,所以我想纠正校准图像.我希望这将涉及使用调用,warpPerspective但我没有看到采用相机矩阵的明显函数,以及旋转和平移向量来生成此调用的透视矩阵.

基本上我想做这里描述的过程(特别是看到最后的图像),但从已知的相机模型和姿势开始.

是否有一个简单的函数调用,它采用相机的内在和外在参数,并计算透视矩阵用于warpPerspective

在打电话给图像warpPerspective后我会打电话undistort.

原则上,我可以通过在指定约束后解决opencv相机校准文档顶部定义的方程组来推导出解决方案Z=0,但我认为必须有一个固定的例程,允许我对我的测试图像进​​行正射校正.

在我看来,我发现很难通过所有的立体声校准结果 - 我只有一个摄像头,但想要在我只看平面测试模式的约束条件下纠正图像.

BCo*_*nic 15

实际上,没有必要涉及正交相机.以下是如何获得适当的透视变换.

如果使用校准照相机cv::calibrateCamera,则得到的摄象机矩阵K透镜畸变系数的向量D为您的相机,并且对于你所使用的每个图像,旋转矢量rvec(可以转换为一个3×3矩阵R使用cv::rodrigues,DOC)和平移矢量T.考虑其中一个图像和相关的RT.cv::undistort使用失真系数调用后,图像就像投影矩阵的摄像机一样K * [ R | T ].

基本上(如@DavidNilosek直觉),要取消旋转并获得图像,就好像它是由形式的投影矩阵获得K * [ I | -C ]其中C=-R.inv()*T的摄像机位置.为此,您必须应用以下转换:

Hr = K * R.inv() * K.inv()
Run Code Online (Sandbox Code Playgroud)

唯一可能的问题是扭曲的图像可能会超出图像平面的可见部分.因此,您可以使用其他翻译来解决该问题,如下所示:

     [ 1  0  |         ]
Ht = [ 0  1  | -K*C/Cz ]
     [ 0  0  |         ]
Run Code Online (Sandbox Code Playgroud)

其中Cz是沿Oz轴的C分量.

最后,根据上面的定义,H = Ht * Hr是对所考虑的图像的整流透视变换.