如何通过HoloLens 2获取目标图像的相机坐标系图像坐标
从HoloLens 2获取Vuforia未处理的原始相机坐标系图像坐标
一、将目标世界坐标转换为相机本地坐标系3D坐标
如果你已经通过Vuforia拿到了目标的世界空间坐标,直接利用Unity的相机变换即可得到相机坐标系下的坐标,无需深挖Vuforia内部转换逻辑:
// 假设已获取跟踪目标的世界坐标 Vector3 targetWorldPos = trackableBehaviour.transform.position; // 转换为相机本地坐标系下的坐标 Vector3 targetCameraLocalPos = Camera.main.transform.InverseTransformPoint(targetWorldPos);
targetCameraLocalPos就是完全基于相机坐标系的3D坐标,未经过Vuforia空间映射的额外处理。
二、获取目标对应的原始图像像素坐标
如果需要的是目标在相机原始图像上的像素坐标,直接调用Vuforia公开的TrackableResult API:
void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus) { if (newStatus == TrackableBehaviour.Status.TRACKED) { var trackableResult = trackableBehaviour.CurrentTrackableResult; if (trackableResult != null) { // 获取目标在原始相机图像上的像素点集合 List<Vector2> rawImagePoints = trackableResult.GetImagePoints(); // 遍历使用像素坐标,比如rawImagePoints[0]是目标的一个角点坐标 } } }
这里返回的像素坐标是相机传感器直接输出的原始数据,没有经过Vuforia的空间映射矫正。
三、自行通过相机姿态矩阵转换
如果需要更底层的姿态控制,可以直接获取相机的世界姿态矩阵,通过逆矩阵完成坐标转换:
// 获取Vuforia相机的世界姿态矩阵 Matrix4x4 cameraWorldPose = Vuforia.CameraDevice.Instance.GetCameraPose(); // 计算相机本地坐标系的变换矩阵(世界转相机) Matrix4x4 cameraToWorldInverse = cameraWorldPose.inverse; // 将目标世界坐标转换为相机本地坐标 Vector3 targetCameraLocalPos = cameraToWorldInverse.MultiplyPoint(targetWorldPos);
内容的提问来源于stack exchange,提问作者sanjay dabhi
相关产品推荐
相关产品推荐

