mediapipe坐标转换ue坐标
时间: 2023-07-30 11:11:40 浏览: 151
MediaPipe 和 Unreal Engine 使用的坐标系不同,因此需要进行坐标转换。具体方法如下:
1. MediaPipe 坐标系是以左上角为原点的坐标系,横轴向右延伸,纵轴向下延伸,单位为像素。
2. Unreal Engine 坐标系是以中心点为原点的坐标系,横轴向右延伸,纵轴向上延伸,单位为厘米。
因此,需要进行以下步骤:
1. 将 MediaPipe 坐标系的原点从左上角移动到中心点。方法是将 x 坐标减去图像宽度的一半,将 y 坐标减去图像高度的一半。
2. 将 MediaPipe 坐标系的纵轴方向翻转。方法是将 y 坐标乘以 -1。
3. 将 MediaPipe 坐标系的单位由像素转换为厘米。方法是将 x 和 y 坐标分别除以一个缩放因子,该缩放因子可以通过实际测试得到,一般为 30 或者 40。
以下是一个示例代码,其中 `mp_x` 和 `mp_y` 是 MediaPipe 坐标系的坐标值,`img_width` 和 `img_height` 是图像的宽度和高度,`scale_factor` 是缩放因子,`ue_x` 和 `ue_y` 是转换后的 Unreal Engine 坐标系的坐标值。
```c++
float scale_factor = 30.0f; // or 40.0f
float ue_x = (mp_x - img_width / 2) / scale_factor;
float ue_y = -(mp_y - img_height / 2) / scale_factor;
```
相关问题
mediapipe坐标转换ue世界坐标
要将 MediaPipe 中的坐标转换为 Unreal Engine 中的世界坐标,您需要执行以下步骤:
1. 获取 MediaPipe 中的坐标(x,y)。
2. 使用 Unreal Engine 的相机投影矩阵将 MediaPipe 坐标转换为相机空间坐标。
3. 使用相机的位置和旋转将相机空间坐标转换为世界坐标。
下面是一个示例代码:
```cpp
// MediaPipe 中的坐标
float mediapipe_x = 0.5f;
float mediapipe_y = 0.5f;
// 获取 Unreal Engine 相机
APlayerCameraManager* cameraManager = GetWorld()->GetFirstPlayerController()->PlayerCameraManager;
if (cameraManager == nullptr) {
return;
}
// 使用相机投影矩阵将 MediaPipe 坐标转换为相机空间坐标
FVector cameraSpacePos = FVector((mediapipe_x - 0.5f) * 2.0f, (mediapipe_y - 0.5f) * 2.0f, 0.0f);
FMatrix projectionMatrix = cameraManager->GetCameraProjectionMatrix();
FMatrix invProjectionMatrix = projectionMatrix.Inverse();
FVector cameraSpacePosHomogeneous = FVector::TransformPosition(cameraSpacePos, invProjectionMatrix);
// 使用相机位置和旋转将相机空间坐标转换为世界坐标
FVector cameraPos = cameraManager->GetCameraLocation();
FRotator cameraRot = cameraManager->GetCameraRotation();
FTransform cameraTransform(cameraRot, cameraPos);
FVector worldPos = cameraTransform.TransformPosition(cameraSpacePosHomogeneous);
```
在这个示例代码中,我们使用 MediaPipe 中的坐标(0.5, 0.5),并假设您已经获取了 Unreal Engine 中的相机。我们首先将 MediaPipe 坐标转换为相机空间坐标,然后使用相机的位置和旋转将相机空间坐标转换为世界坐标。最终,我们得到了在 Unreal Engine 世界中的坐标。
mediapipe坐标转换ue骨骼坐标
首先,我们需要了解Mediapipe和UE的坐标系不同。Mediapipe使用的是左手坐标系,其中x轴指向右侧,y轴指向下方,z轴指向前方。UE使用的是右手坐标系,其中x轴指向前方,y轴指向右侧,z轴指向上方。因此,我们需要进行坐标系转换才能将Mediapipe的坐标转换为UE的骨骼坐标。
以下是一个可能的解决方案:
1. 获取Mediapipe的关键点坐标。
2. 将Mediapipe的坐标系转换为UE的坐标系。具体地,将Mediapipe的x轴和y轴翻转,然后将z轴和y轴交换。
3. 将转换后的坐标映射到UE的骨骼关节上。这需要在UE中确定每个关节的名称和位置。
4. 将转换后的关键点坐标赋值给对应的骨骼关节。
这里提供一个简单的代码示例,假设我们有一个名为`mediapipeKeyPoints`的数组,其中包含了所有的关键点坐标。我们也假设我们已经在UE中创建了一个骨骼,其中包含了所有要使用的关节。以下代码可以将`mediapipeKeyPoints`的坐标转换为UE的骨骼坐标:
```cpp
// 定义Mediapipe和UE坐标系之间的转换矩阵
FMatrix mediapipeToUE;
mediapipeToUE.SetIdentity();
mediapipeToUE.SetAxis(0, FVector(-1.f, 0.f, 0.f)); // x轴翻转
mediapipeToUE.SetAxis(1, FVector(0.f, -1.f, 0.f)); // y轴翻转
mediapipeToUE.SetAxis(2, FVector(0.f, 0.f, 1.f)); // z轴和y轴交换
// 获取Mediapipe关键点坐标
std::vector<cv::Point3f> mediapipeKeyPoints = getMediapipeKeyPoints();
// 将坐标转换为UE骨骼坐标
std::vector<FTransform> ueBoneTransforms;
for (int i = 0; i < mediapipeKeyPoints.size(); i++) {
cv::Point3f mediapipePoint = mediapipeKeyPoints[i];
FVector uePosition = mediapipeToUE.TransformPosition(FVector(mediapipePoint.x, mediapipePoint.y, mediapipePoint.z));
FTransform ueTransform(uePosition);
ueBoneTransforms.push_back(ueTransform);
}
// 将转换后的关键点坐标赋值给对应的骨骼关节
for (int i = 0; i < ueBoneTransforms.size(); i++) {
FName boneName = getBoneNameForIndex(i); // 根据索引获取骨骼名称
FTransform boneTransform = ueBoneTransforms[i];
getBoneByName(boneName)->SetBoneTransform(boneTransform, EBoneSpaces::WorldSpace);
}
```
请注意,这只是一个简单的示例代码,实际的实现可能需要进行更多的坐标转换和骨骼匹配。