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

求解相机内参矩阵K时遇广播错误:无法将(2,)转为(3,)形状

相机内参求解错误修复及正确实现

错误原因

  1. 直接报错原因:image_points中每个点是2维坐标(u,v),而原代码试图将其赋值给A矩阵中长度为3的切片A[2*i+1, :3],形状不匹配((2,) vs (3,)),导致广播失败。
  2. 根本问题:A矩阵的构造逻辑完全不符合相机标定的DLT(直接线性变换)算法要求,原代码的矩阵填充方式完全错误,无法正确求解投影矩阵。

正确实现思路

相机标定的DLT方法基于投影方程:x = PX,其中:

  • X是世界点的齐次坐标(x_w, y_w, z_w, 1)
  • x是图像点的齐次坐标(u, v, 1)
  • P是3×4的投影矩阵,可分解为内参K和外参[R|t]

对于每一对对应点,可推导出2个线性方程,将所有点的方程组合成A矩阵(2N×12),通过SVD求解投影矩阵P,再分解得到内参K。

修正后的代码

import numpy as np

def calibrate_camera(world_points, image_points, N):
    # 初始化A矩阵(2N行,12列)
    A = np.zeros((2 * N, 12))
    for i in range(N):
        X, Y, Z = world_points[i]
        u, v = image_points[i]
        # 填充第2i行(对应u的方程)
        A[2*i] = [-X, -Y, -Z, -1, 0, 0, 0, 0, u*X, u*Y, u*Z, u]
        # 填充第2i+1行(对应v的方程)
        A[2*i+1] = [0, 0, 0, 0, -X, -Y, -Z, -1, v*X, v*Y, v*Z, v]

    # SVD分解求解投影矩阵P的向量形式
    U, S, V = np.linalg.svd(A)
    p = V[:, -1]
    # 重构3×4的投影矩阵P
    P = p.reshape((3, 4))

    # 从P分解内参K和外参[R|t](使用QR分解)
    # 提取P的前3列组成矩阵M
    M = P[:, :3]
    # QR分解得到K和R
    K, R = np.linalg.qr(M)
    # 确保K的对角线元素为正(相机内参的焦距等应为正数)
    diag_sign = np.sign(np.diag(K))
    K = K @ np.diag(diag_sign)
    R = np.diag(diag_sign) @ R

    # 处理平移向量t
    t = np.linalg.inv(K) @ P[:, 3]

    # 返回内参矩阵K(通常K是3×3,包含fx, fy, cx, cy等参数)
    return K

if __name__ == "__main__":
    # 世界点(3D)和图像点(2D)
    world_points = np.array([[0,0,0],[0,3,0],[0,7,0],[0,11,0],[7,1,0],[0,11,7],[7,9,0],[0,1,7]])
    image_points = np.array([[757,213],[758,415],[758,686],[759,966],[1190,172],[329,1041],[1204,850],[340,159]])
    N = len(world_points)  # 直接用点的数量,避免手动输入错误

    K = calibrate_camera(world_points, image_points, N)
    print("相机内参矩阵K:")
    print(K)

关键修正说明

  • 正确构造了DLT所需的A矩阵,每个点生成两行符合投影方程的系数。
  • 添加了从投影矩阵P分解内参K的步骤(QR分解),原代码直接将P的元素拼接成K的方式错误,因为P是K和外参的乘积,不能直接拆分。
  • 确保K的对角线元素为正,符合相机内参的物理意义(焦距、主点坐标均为正)。
  • 自动计算点的数量N,避免手动输入错误。

内容的提问来源于stack exchange,提问作者Kaustubh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:12:49