我正在使用opencv来校准我的网络摄像头。因此,我所做的是将我的网络摄像头固定到一个装备上,使其保持静止,我使用了棋盘校准模式并将其移到摄像机前面并使用检测到的点来计算校准。所以,这正如我们在许多opencv示例中所见(https://docs.opencv.org/3.1.0/dc/dbb/tutorial_py_calibration.html)
现在,这给了我相机内在矩阵和旋转和平移组件,用于将每个棋盘视图从棋盘空间映射到世界空间。
然而,我感兴趣的是全局外在矩阵,即一旦我移除了棋盘,我希望能够在图像场景中指定一个点,即x,y及其高度,它给了我在世界空间中的位置。据我所知,我需要内在和外在矩阵。如何从这里开始计算外在矩阵?我是否可以使用我从棋盘校准步骤中收集的测量值来计算外在矩阵?
让我来一些背景。请看下面的图片,(来自https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html):
相机已“附着”刚性参考框架(Xc,Yc,Zc)。您成功执行的内在校准允许您将点(Xc,Yc,Zc)转换为图像(u,v)上的投影,并将图像中的点(u,v)转换为光线(Xc, Yc,Zc)(你只能达到比例因子)。
实际上,你想把相机放在一个外部的“世界”参考系中,我们称它为(X,Y,Z)。然后是一个刚性变换,由旋转矩阵R和平移向量T表示,这样:
|Xc| |X|
|Yc|= R |Y| + T
|Zc| |Z|
这是外在校准(也可以写成4x4矩阵,即你所谓的外在矩阵)。
现在,答案。要获得R和T,您可以执行以下操作:
您需要至少3个非共线点和相应的3D-2D坐标才能使solvePnP正常工作(link),但越多越好。要获得高质量的分数,您可以打印出一个巨大的棋盘图案,将其平放在地板上,并将其用作网格。重要的是图像中的图案不是太小(校准越大,校准就越稳定)。
并且,非常重要:对于内在校准,您使用了具有特定大小的正方形的国际象棋模式,但是您告诉算法(对每个模式执行某种解决方案),每个方块的大小为1.这不是显式,但是在示例代码的第10行中完成,其中网格使用坐标0,1,2,...构建:
objp [:,:2] = np.mgrid [0:7,0:6] .T.reshape(-1,2)
外部校准的世界规模必须与此匹配,因此您有以下几种可能性: