Python OpenCV立体声校准对象点

时间:2017-01-17 23:25:32

标签: python opencv stereoscopy

我真的很难掌握这个东西,我只是python中的初学者,我找不到对此代码的解释。

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*9,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
原来是,9是7.我假设9和6分别是棋盘图案的列和行的内角。 (所以我的棋盘真的是10x7)

现在,我知道棋盘上方块的大小,我想不出的是把它放在哪里。

每次对每张图片进行迭代时,我发现的代码都是这样做的:

objpoints.append(objp)

我可以看到,它总是一次又一次地推动同一个物体。

两个问题: 每次迭代objpoints.append(objp)如何产生影响?

我如何在代码中指定方形大小?我应该把它放在哪里?

我知道对象点是棋盘中每个方格的三维点,这就是为什么我很困惑它甚至在每次迭代中都没有被操纵。

谢谢!

编辑: 我的stereocalib代码:http://pastebin.com/pw5n3pme

(这只是个别相机校准的修改版本)

2 个答案:

答案 0 :(得分:2)

我也在使用Python和OpenCV进行立体相机校准,我知道第二个问题的答案(第1个问题已经回答了)。

  

我如何在代码中指定方形大小?我应该把它放在哪里?

在这里,如果您的方形尺寸假定为30 mm,则将此值乘以objp[:,:2]。喜欢这个

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)*30 # 30 mm size of square

因为objp[:,:2]是一组棋盘角点,给定为(0,0),(0,1),(0,2)......(8,5)。 (0,0)点是左上角的方角,(8,5)是右下角的方角。在这种情况下,这些点没有单位,但如果我们将这些值乘以方形大小(例如30毫米),那么这些将变为(0,0),(0,30),......(240,150)是现实世界的单位。在这种情况下,您的翻译向量将以 mm单位

答案 1 :(得分:1)

我将假设您正在与this code或类似的人合作。

第一个问题

  

每次迭代的objpoints.append(objp)如何产生影响?   它没有。从你发布的那一行开始,看看这个

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)

这里计算棋盘角落的位置,在某个棋盘中,它们总是相同的。每次迭代,您都会在相机中找到不同的imgpoint 以获取棋盘中的相同点

如果不是相同的点,则无法执行校准

第二个问题

  

我如何在代码中指定方形大小?我应该把它放在哪里?

在我发布的教程中,对于Python和OpenCV,您不应指定平方大小。它是单声道校准,因此方形尺寸仅与比例因子有关,在单声道相机中(相当)无用。您将获得具有未定义(或可能等于1)比例因子的正确相机矩阵。

如果您有不同的代码(例如立体声校准),请发布它,我会尝试找到方形尺寸必须放在哪里。