首页 > 解决方案 > 单点错误三角测量(用 4 点板校准)

问题描述

我正在使用 6 台 RGB 摄像机拍摄一个我想以 3D 形式重建的场景,如下图所示。我忘了拿校准棋盘。所以我用一个空白的矩形板代替并拍摄它,就像我拍摄一个普通的棋盘一样。
3D重建

第一步,校准--> OK。
我显然不能使用cv2.findChessboardCorners,所以我制作了一个小程序,可以让我单击并存储每个 4 个角的位置。我从这 4 个点校准了大约 10-15 帧作为测试。
Tl;博士:它似乎工作得很好。

下一步,三角测量。--> 不行
,我使用直接线性变换 (DLT) 对所有 6 个摄像机的点进行三角测量。
Tl;Dr : 效果不太好。

4 个点中有 3 个被正确三角剖分,但应该位于原点的蓝色点的 x 坐标错误。
三角测量失败

为什么?
为什么只有一点,为什么只有 x 坐标?
这与我从 4 点板校准的事实有关吗?
如果是这样,你能解释一下吗?如果不是,那还能是什么?
更新:当板在其他地方时,我尝试了另一个框架,并且三角测量很好。
所以有一个谜:一些点是随机三角错误的(或者至少是原点的那个),而其他大部分都很好。再说一遍,为什么?

我的猜测是它来自三角测量而不是校准,并且与我草率的校准过程无关。
我遇到的一个常见问题是 DLT 找到的解决方案含糊不清。实际上,求解 AQ = 0 或求解 AC C-¹Q 给出了相同的解。请参见此处的第 46 页。但我不知道该怎么办。


我现在相当确定这不是校准问题,但我不想删除我帖子的这一部分。

标签: opencvcomputer-visioncamera-calibrationtriangulation

解决方案


我不太明白你在问什么,它相当模糊。但是,我认为您错误地计算了投影矩阵。如果我没记错的话,您肯定会以这种方式在现实世界空间中定义代表您的矩形的 4 个 3D 点,例如:

pt_3D = [[ 0  0  0]
         [ 0  1  0]
         [ 1  1  0]
         [ 1  0  0]]

然后,您将检索每个图像的相应 2D 点(按顺序),并生成两个向量,如下所示:

objpoints = [pt_3D,      pt_3D,      ....] # N times
imgpoints = [pt_2D_img1, pt_3D_img2, ....] # N times ( N images )

然后,您可以校准相机并恢复相机姿势以及投影矩阵,如下所示:

    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, imSize, None, None)
    cv2.projectPoints(objpoints, rvecs, tvecs, K, dist)
    

    for rvec, tvec in zip(rvecs, tvecs):
        Rt, _ = cv2.Rodrigues(rvec)
        R = Rt.T
        T = - R @ tvec
        pose_Matrix       = np.vstack(( np.hstack((R,T)) , [0, 0, 0, 1])) ( transformation matrix == camera pose )
        Projection_Matrix = K @ TransformationMatrix.T[:3, :4] 

您不必应用 DLT 或三角测量(一切都在cv2.calibrateCamera ()函数中完成,3D 点仍然是您自己定义的


推荐阅读