手动实现DLT相机标定所得K矩阵与OpenCV结果偏差过大求助
手动复现OpenCV calibrateCamera()的K矩阵估计问题
为完成大学作业,我手动复现OpenCV的calibrateCamera()方法,对比结果时发现手动估计的相机内参矩阵K与OpenCV输出差异显著。具体操作如下:
操作步骤与代码实现
- SVD求解相机投影矩阵P
我从指定PNG图像中手动测量得到图像点(imgp)与物体点(objp),通过构建方程组求解Ap=0的最小化问题来估计相机投影矩阵P,代码如下:
A = np.zeros((points * 2, 12), dtype = np.float32) X, Y, Z = 0, 1, 2 for i in range(points): A[2 * i:] = np.array([ objp[i,X], objp[i,Y], objp[i,Z], 1, 0, 0, 0, 0, -imgp[i,X] * objp[i,X], -imgp[i,X] * objp[i,Y], -imgp[i,X] * objp[i,Z], -imgp[i,X] ]) A[2 * i + 1:] = np.array( [ 0, 0, 0, 0, objp[i,X], objp[i,Y], objp[i,Z], 1, -imgp[i,Y] * objp[i,X], -imgp[i,Y] * objp[i,Y], -imgp[i,Y] * objp[i,Z], -imgp[i,Y] ] ) U, S, Vt = np.linalg.svd(A) P = Vt[np.argmin(S)] return P.reshape(3, 4)
- RQ分解得到K矩阵
通过RQ分解从P中提取内参K(归一化使K[2,2]=1)和外参R,代码如下:
K, R = linalg.rq(P[:3,:3]) K = K/K[2,2]
结果对比
手动计算得到的K矩阵、OpenCV输出的K矩阵及两者绝对误差如下:
K [[ 1.1347135e+03 -1.5465388e+01 5.4754879e+01] [ 0.0000000e+00 1.1388589e+03 -1.3496671e+02] [ 0.0000000e+00 0.0000000e+00 1.0000000e+00]] K OpenCV [[ 1.04488512e+03 0.00000000e+00 3.67825286e+01] [ 0.00000000e+00 1.06650239e+03 -5.04452860e+02] [ 0.00000000e+00 0.00000000e+00 1.00000000e+00]] Errore assoluto [[ 89.82838194 15.4653883 17.97235037] [ 0. 72.35649686 369.48615424] [ 0. 0. 0. ]]
我严格按照学校课件步骤操作,但结果偏差较大,希望得到相关建议与指点。
内容的提问来源于stack exchange,提问作者Emanuele Muzio
相关产品推荐
相关产品推荐

