相机标定时,标定板上的坐标系是怎样选取的,我需要将真实世界的三维坐标转为像素坐标系坐标,那么标定板上的世界坐标系要选取真实的世界坐标系吗?
标定板上的坐标系是由用户任意选择一个基准坐标系作为参考来描述摄像机位置,在相机标定中一般选择标定板坐标系作为世界坐标系。
如果你需要将真实世界的三维坐标转为像素坐标系坐标,那么你需要知道摄像机的内参和外参,内参描述了从相机坐标系到图像坐标系的变换,外参描述了从世界坐标系到相机坐标系的变换。通过这两个参数,你可以得到从世界坐标系到图像坐标系的变换矩阵,然后将真实世界的三维点乘以该矩阵就可以得到对应的像素点。
1、世界坐标系到相机坐标系之间的转换:世界坐标系是真实世界的基准坐标系,我们需要知道相机坐标系下的点在世界坐标中的位置,利用齐次坐标转换矩阵。
2、相机坐标系到图像坐标系之间的转换:该转换可以看成简单的射影变换(将相机看成小孔模型),将三维坐标变换成二维坐标。其中f为焦距:
3、图像最坐标系到像素坐标系:
他们之间的转换关系为:
答案:
标定板的坐标系通常使用世界坐标系作为参考系。在进行真实世界中三维坐标到像素坐标系中二维坐标的转换时,需要首先进行如下的变换: 1. 将世界坐标系中的三维点的坐标表示为[X,Y,Z,1]的齐次坐标; 2. 将世界坐标系中的三维点变换到相机坐标系中,即进行刚体变换和平移。将世界坐标系中的三维点乘以外参矩阵,得到相机坐标系中的点; 3. 将相机坐标系中的三维点变换到像素坐标系中。根据相机内参矩阵和像素坐标系中的坐标表示方式,将相机坐标系中的三维点映射到像素坐标系中的点。
其中,外参矩阵包括旋转矩阵和平移矩阵,可以通过相机标定获得。旋转矩阵一般是一个3x3的矩阵,可以通过相机标定获得旋转向量,然后通过罗德里格斯变换转化为旋转矩阵。平移矩阵是一个3x1的矩阵,表示世界坐标系中原点到相机坐标系中的光心的距离。
相机内参矩阵包括相机焦距、主点坐标和像素与毫米之间的换算关系,可以通过相机标定获得。
Python 代码示例:
# 获取相机外参和内参矩阵
ext_mat = np.zeros((3, 4))
int_mat = np.zeros((3, 3))
dist_coeffs = np.zeros((5, 1))
retval, ext_mat, int_mat, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(
objpoints, imgpoints, gray.shape[::-1], int_mat, dist_coeffs
)
# 将世界坐标系中的三维点变换到相机坐标系中
world_point_homogenous = np.ones((4, 1))
world_point_homogenous[:3, 0] = world_point
camera_point_homogenous = np.matmul(ext_mat, world_point_homogenous)
# 将相机坐标系中的三维点映射到像素坐标系中
fx = int_mat[0, 0]
fy = int_mat[1, 1]
cx = int_mat[0, 2]
cy = int_mat[1, 2]
u = int(fx * camera_point_homogenous[0, 0] / camera_point_homogenous[2, 0] + cx)
v = int(fy * camera_point_homogenous[1, 0] / camera_point_homogenous[2, 0] + cy)
其中,objpoints 和 imgpoints 表示相机标定板上的三维点对和对应的像素坐标点对。world_point 表示世界坐标系中的一个三维点,gray 为相机标定板的灰度图片。