校准摄像机和stereoCalibrate的正确“objpoints”应该是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了校准摄像机和stereoCalibrate的正确“objpoints”应该是什么?相关的知识,希望对你有一定的参考价值。

我有一台立体相机,我需要做内在和外在的校准。虽然重投影误差似乎很好(<0.1像素),但外在因素很奇怪。左右相机之间的转换太小。

我跟着这个tutorial用于两个摄像头的内在函数,然后使用stereoCalibrate作为外​​在函数。

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(8,6,0)
objp = np.zeros((9*7,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:7].T.reshape(-1,2)
objpoints2 = []
imgpoints2 = []

# Load images
images = glob.glob('*.tiff')
for fname in images:
    img = cv2.imread(fname)
    # Find the chess board corners
    ret, corners = cv2.findCirclesGrid(img, (9,7), flags=cv2.CALIB_CB_SYMMETRIC_GRID, blobDetector=detector)
    # If found, add object points, image points (after refining them)
    if ret:
        objpoints2.append(objp)
        imgpoints2.append(corners)
        # Draw and display the corners
        img = cv2.drawChessboardCorners(img, (9,7), corners, ret)
        cv2.imshow('img', img)
        cv2.waitKey(50)
cv2.destroyAllWindows()
matrix2, distort2 = cv2.calibrateCamera(objpoints2, imgpoints2, (640,480), None, None)

然后我做立体声校准:

R, T = cv2.stereoCalibrate(objpoints2, imgpoints1, imgpoints2, matrix1, distort1, matrix2, distort2, (640,480))

我的问题是objp的正确值是什么?我使用了教程中的值,但这是否意味着我的模式是1 mm appart?

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

非常感谢。

答案

我找到了答案。

对于内在校准,如果我不提供角之间的正确距离并不重要。

但是,对于extrinsics(立体声)校准,我必须提供正确的值,否则比例将是错误的,并且转换将是小的。

或者,我需要将实际图案距离乘以最终平移向量以获得正确的比例。

以上是关于校准摄像机和stereoCalibrate的正确“objpoints”应该是什么?的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv进行多摄像头校准:两个摄像头相互面对

双目标定

关于“cameraMatrix”不是数字元组的cv2.stereocalibrate()错误

如何验证网络摄像头校准的正确性?

使用数码相机进行相机校准

单平面的摄像机校准