假设您通过 objpoints-imgpoints 对校准相机。请注意,第一个是校准板上特征点的真实 3 维坐标,第二个是每个图像中特征点的 2 维像素位置。因此,它们都应该是包含校准板图像元素数量的列表。在执行 Python 代码行之后,您将获得校准矩阵 mtx、每个校准板的旋转 rvecs 及其平移 tvecs。
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, np.zeros(5,'float32'),flags=cv2.CALIB_USE_INTRINSIC_GUESS )
现在我们可以在假设下找到任意像素的 3D 坐标。这个假设是我们需要定义一些参考点。假设我们的参考是第 0 个(第一个)校准板,其枢轴点位于 0,0,其中校准板的长轴为 x,短轴为 y 轴,校准板的表面也显示 Z= 0 飞机。这是我们创建投影矩阵的方法。
# projection matrix
Lcam=mtx.dot(np.hstack((cv2.Rodrigues(rvecs[0])[0],tvecs[0])))
现在我们可以定义任何像素位置和所需的 Z 值。请注意,由于我想在参考校准板上投影 (100,100) 像素位置,因此我设置 Z=0。
px=100
py=100
Z=0
X=np.linalg.inv(np.hstack((Lcam[:,0:2],np.array([[-1*px],[-1*py],[-1]])))).dot((-Z*Lcam[:,2]-Lcam[:,3]))
现在我们有了 (px,py) 像素的 X 和 Y 坐标,即 X[0], X[1] 。
X 的最后一个元素是 lambda 因子。结果我们可以说,(px,py) 位置上的像素落在第 0 个校准板表面上的 X[0],X[1] 坐标上。