之前曾问过类似的问题,很遗憾,我无法评论Samgaks的回答,所以我在此发表了新文章。这是旧问题的链接:
How to calculate ray in real-world coordinate system from image using projection matrix?
我的目标是将图像坐标映射到世界坐标。实际上,我正在尝试使用HoloLens相机的“相机固有参数”执行此操作。
当然,此贴图只会给我连接相机光学中心和所有点的光线,该光线可以位于该光线上。对于从图像坐标到世界坐标的映射,我们可以使用逆相机矩阵:
K ^ -1 = [1 / fx 0 -cx / fx; 0 1 / fy -cy / fy; 0 0 1]
Pcam = K ^ -1 * Ppix;
Pcam_x = P_pix_x / fx-cx / fx;
Pcam_y = P_pix_y / fy-cy / fy;
Pcam_z = 1
Orientation of Camera Coordinate System and Image Plane
在这种特定情况下,图像平面可能位于Z = -1(但是,我对此不太确定)。第HoloLens CameraProjectionTransform页的“ 应用程序指定的坐标系统的像素” 部分介绍了如何将像素坐标转换为世界坐标。据我了解,K ^ -1中的两个符号被翻转。我们计算坐标如下:
Pcam_x =(Ppix_x / fx)-(cx *(-1)/ fx)= P_pix_x / fx + cx / fx;
Pcam_y =(Ppix_y / fy)-(cy *(-1)/ fy)= P_pix_y / fy + cy / fy;
Pcam_z = -1
Pcam =(Pcam_x,Pcam_y,-1)
CameraOpticalCentre =(0,0,0)
Ray = Pcam-CameraOpticalCentre
对于图像平面处于负Z坐标的情况,我不了解如何创建“相机固有”。我想对为什么要进行符号翻转(P_pix_x / fx + cx / fx而不是P_pix_x / fx-cx / fx)进行数学解释或直观理解。
编辑:我在另一篇文章中读到,如果相机面向负z方向,则必须否定相机矩阵的干渴栏。这将解释符号翻转。但是,为什么我们需要更改第三列的符号。我想对此有一个直观的了解。 这里是帖子Negation of third column
的链接非常感谢, 丽莎