我想用OpenCV C API进行相机校准,使用一组已知的世界来成像点匹配 .
OpenCV有一个名为 cv::calibrateCamera
的函数,如here所述 . 这清楚地提到该功能将推断出平面物体的固有相机矩阵,并且它希望用户为非平面3D环境指定矩阵 .
在我的点对应中,世界坐标不是平面的 . 而且我对内部相机矩阵没有合格的猜测 .
在这种情况下,我该如何校准相机?
目前,我正在使用一种简单的基于DLT的方法来使用 cv::SVD::solveZ
函数进行计算 . 但我想使用OpenCV执行的非线性估计 .
2 回答
This page解释了如何执行相机自动校准 . 这包括使用Kruppa方程的方法,该方程似乎可以使用您期望的非线性技术来解决 .
我处于相同的情况:我有一个非平面的3D目标,但我想在校准过程中使用OpenCV的非线性LM优化 . (张的OpenCV初始化方法只允许平面校准目标)
您可以做的是从您自己的DLT结果中提取相机矩阵,并将其用作
calibrateCamera
的初始猜测 . 仅对一对进行就足够了(相机点 - 对象点) . 即使其他对可能产生其他相机矩阵,它们也可能是相似的,并且您只需要初始化就可以使用该矩阵 .注意,我确实假设,使用您自己的DLT,您可以获得投影矩阵
P
,它将同构世界点X
映射到hom . 图像点x
来自x = P * X
.这将是要走的路,但是在python中,你应该能够适应自己的需求:
注意,由于
calibrateCamera
假定cameraMatrix[2,2]==1
并且被约束为正焦距和0偏斜,因此可能需要校正相机矩阵,正如我在上面的代码中所示 .