世界坐标系(3d) -> 相机坐标系(3d)
时间: 2023-09-15 13:03:26 浏览: 143
世界坐标系是指在三维空间中描述物体位置和方向的坐标系。在这个坐标系中,我们假设一个固定的参考点作为原点,然后用三个轴(通常是X、Y和Z轴)来确定物体在空间中的位置和姿态。世界坐标系通常用于描述物体在整个场景中的位置关系。
相机坐标系是一种特殊的坐标系,用于描述相机或者观察者在三维空间中的位置和姿态。与世界坐标系相比,相机坐标系的原点通常被设置为相机的位置,而轴的方向与相机的朝向有关。这样,相机坐标系可以更好地表示相机的视角和观察方向。
从世界坐标系转换到相机坐标系需要考虑相机的位置和朝向。一般而言,可以采用以下步骤进行转换:
1. 通过相机的位置和方向确定相机坐标系的原点和轴的方向。
2. 将物体在世界坐标系中的位置向相机坐标系进行转换。这可以通过将物体相对相机的位置进行平移和旋转来实现。
3. 通过转换后的坐标系,我们可以更准确地描述物体在相机坐标系中的位置和方向。
通过将物体的位置从世界坐标系转换到相机坐标系,我们可以更自然地描述物体相对于相机的位置和方向。这对于计算机图形学、计算机视觉和虚拟现实等领域非常重要,可以帮助我们更好地理解和处理三维场景中的物体。
相关问题
for (int camera_index = 0; camera_index < this->m_safe_camera_list.size(); ++camera_index) { camera* cam = &(this->m_safe_camera_list[camera_index]); if (cam->m_is_exter_calib_check_mark == true) { // as a Internal reference K of the camera, the K-1 is : // 1/ax 0 -px/ax // 0 1/ay -py/ay // 0 0 1 Eigen::Matrix3f invk; invk.setIdentity(); invk(0, 0) = 1.0 / cam->m_inter_calib(0, 0); invk(0, 2) = -1.0 * cam->m_inter_calib(0, 2) / cam->m_inter_calib(0, 0); invk(1, 1) = 1.0 / cam->m_inter_calib(1, 1); invk(1, 2) = -1.0 * cam->m_inter_calib(1, 2) / cam->m_inter_calib(1, 1); Eigen::Vector3f tmp_t_verts = cam->m_exter_calib.topRightCorner(3, 1); Eigen::Matrix3f tmp_inv_r_mat= cam->m_exter_calib.topLeftCorner(3, 3).transpose(); Eigen::Vector3f tmp_root_point = -tmp_inv_r_mat * tmp_t_verts; for (int pose_index = 0; pose_index < cam->m_2D_pose_list.size(); ++pose_index) { Eigen::MatrixXf pose = cam->m_2D_pose_list[pose_index]; // check the pose's Confidence, if all the joints's confidiance is smaller than the gain, drop out float confidence = pose.row(2).maxCoeff(); if (confidence < this->m_joint_confidence_gian) { continue; }; my_radials tmpradials; tmpradials.m_2d_pose = pose; tmpradials.m_root_point = tmp_root_point; tmpradials.m_radials_points = (invk * pose.topRows(2).colwise().homogeneous()).colwise().normalized(); tmpradials.m_radials_points = tmp_inv_r_mat * tmpradials.m_radials_points; tmpradials.m_3d_pose_ID = -1; tmpradials.m_camera_index = camera_index; tmpradials.m_poes_index = pose_index; tmpradials.m_pose_confidence = pose.row(2).leftCols(7).sum(); this->m_3d_radials.push_back(tmpradials); } } }
这段代码是一个 for 循环,遍历了一个名为 m_safe_camera_list 的相机列表。对于列表中的每个相机,如果其 m_is_exter_calib_check_mark 属性为 true,则进行以下操作:
1. 计算相机的内参矩阵 K 的逆矩阵 invk,其中 K 的值被存储在相机的 m_inter_calib 属性中;
2. 计算相机的外参矩阵 m_exter_calib 的逆矩阵的转置矩阵 tmp_inv_r_mat;
3. 根据 tmp_inv_r_mat 和 m_exter_calib 中的平移向量计算相机在世界坐标系下的位置 tmp_root_point;
4. 遍历相机 m_2D_pose_list 中的姿态,对于每个姿态:
- 检查该姿态的置信度是否大于设定的阈值 m_joint_confidence_gian,如果不是则跳过;
- 构建一个名为 tmpradials 的结构体,存储该姿态的相关信息,包括姿态的 2D 坐标、3D 坐标、相机索引、姿态索引等;
- 将 tmpradials 添加到名为 m_3d_radials 的结构体列表中。
整个代码的作用是将相机的 2D 姿态转换为 3D 姿态,并将结果存储在 m_3d_radials 中。
def matched_points(K, img_depth1, img_depth2, keypoint1, keypoint2, good_matches): # 将good_matches转换为cv2.DMatch类型 good_matches = [cv2.DMatch(*match) for match in good_matches] # 测试图像特征点坐标列表(->int) points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int) # 样本图像特征点坐标列表(->int),PnP 3D-2D中的2D points2 = np.array([list(keypoint2[x.trainIdx].pt) for x in good_matches]).astype(int) points_3d1 = [] points_3d2 = [] for i in range(points1.shape[0]): depth1 = img_depth1[points1[i][1], points1[i][0]] # 深度信息,由于imread得到宽高顺序,所以1,0 depth2 = img_depth2[points2[i][1], points2[i][0]] if depth1 == 0 or depth2 == 0: # 没有读取到深度->bad depth continue # 坐标转化为归一化坐标 point1 = pixel2cam(points1[i], K) point2 = pixel2cam(points2[i], K) # 读取深度,这里除以5000不太清楚是固定步骤还是说可改参数( dd1 = depth1 / 5000.0 dd2 = depth2 / 5000.0 points_3d1.append([point1[1] * dd1, point1[0] * dd1, dd1]) # 世界坐标系坐标 points_3d2.append([point2[1] * dd2, point2[0] * dd2, dd2]) # 相机图像坐标系坐标 points_3d1 = np.array(points_3d1).astype(np.float64) points_3d2 = np.array(points_3d2).astype(np.float64) return points_3d1, points_3d2
这段代码主要是实现了从两张图像中提取出匹配的特征点,并计算出这些特征点在世界坐标系下的坐标。具体来说,该函数的输入参数包括相机内参矩阵K、两张图像的深度图img_depth1和img_depth2、以及两张图像中的特征点keypoint1和keypoint2以及它们之间的匹配good_matches。该函数的输出结果包括points_3d1和points_3d2两个数组,分别表示两张图像中匹配特征点在世界坐标系下的坐标。在计算这些坐标时,需要将特征点的坐标转换为归一化坐标,并通过深度信息计算出世界坐标系下的坐标。该函数还对于没有读取到深度信息的特征点进行了过滤处理。
阅读全文