Python OpenCV 立体校准对象点
Python OpenCV Stereo Calibrate Object Points
我真的很难掌握这个东西,我只是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)
对每次迭代有何影响?
如何在代码中指定方块大小?我应该把它放在哪里?
我知道对象点是棋盘中每个方块的 3d 点,这就是为什么我很困惑它甚至在每次迭代中都没有被操纵。
谢谢!
编辑:
我的 stereocalib 代码:http://pastebin.com/pw5n3pme
(只是个别相机标定的修改版)
我假设您正在使用 this code 或类似的工具。
第一题
how does objpoints.append(objp) on every iteration make a difference?
It doesn't. From the line you posted, look at this
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
这里是计算棋盘角的位置,在某个棋盘上,角的位置总是相同的。每次迭代,您都会在相机中找到不同的 imgpoints 对于棋盘中的相同点 。
如果点不相同,则无法执行校准
第二题
how can i specify in the code, the square size? where should i put it?
在我 post 编辑的教程中,对于 Python 和 OpenCV,您不应指定正方形大小。它是 mono-calibration,所以正方形大小只与比例因子有关,在单相机中(相当)没用。您将获得具有未定义(或可能等于 1)比例因子的正确相机矩阵。
如果您有不同的代码(例如立体校准),post 它,我会尝试找到必须放置方形尺寸的位置。
我也在 Python 和 OpenCV 中进行立体相机校准,我知道你第二个问题的答案(因为第一个问题已经回答)。
how can i specify in the code, the square size? where should i put it?
在这里,如果您的正方形尺寸假设为 30 毫米,则将此值乘以 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 为单位。
我真的很难掌握这个东西,我只是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)
对每次迭代有何影响?
如何在代码中指定方块大小?我应该把它放在哪里?
我知道对象点是棋盘中每个方块的 3d 点,这就是为什么我很困惑它甚至在每次迭代中都没有被操纵。
谢谢!
编辑: 我的 stereocalib 代码:http://pastebin.com/pw5n3pme
(只是个别相机标定的修改版)
我假设您正在使用 this code 或类似的工具。
第一题
how does objpoints.append(objp) on every iteration make a difference? It doesn't. From the line you posted, look at this
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
这里是计算棋盘角的位置,在某个棋盘上,角的位置总是相同的。每次迭代,您都会在相机中找到不同的 imgpoints 对于棋盘中的相同点 。
如果点不相同,则无法执行校准
第二题
how can i specify in the code, the square size? where should i put it?
在我 post 编辑的教程中,对于 Python 和 OpenCV,您不应指定正方形大小。它是 mono-calibration,所以正方形大小只与比例因子有关,在单相机中(相当)没用。您将获得具有未定义(或可能等于 1)比例因子的正确相机矩阵。
如果您有不同的代码(例如立体校准),post 它,我会尝试找到必须放置方形尺寸的位置。
我也在 Python 和 OpenCV 中进行立体相机校准,我知道你第二个问题的答案(因为第一个问题已经回答)。
how can i specify in the code, the square size? where should i put it?
在这里,如果您的正方形尺寸假设为 30 毫米,则将此值乘以 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 为单位。