我真的很难掌握这个东西,我只是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
(这只是个别相机校准的修改版本)
答案 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)比例因子的正确相机矩阵。
如果您有不同的代码(例如立体声校准),请发布它,我会尝试找到方形尺寸必须放在哪里。