You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动实现DLT相机标定所得K矩阵与OpenCV结果偏差过大求助

手动复现OpenCV calibrateCamera()的K矩阵估计问题

为完成大学作业,我手动复现OpenCV的calibrateCamera()方法,对比结果时发现手动估计的相机内参矩阵K与OpenCV输出差异显著。具体操作如下:

操作步骤与代码实现

  1. 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)
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:32:35