Я работаю с репозиторием неявной глубины от Niantic Labs, но столкнулся с проблемой. В репозитории нет общего кода для проецирования 3D-точек или значений глубины на плоскость изображения 2D-камеры.
Я пытаюсь спроецировать 3D-объект в сцену, используя Pyrender, встроенные функции ARKit и матрицу положения камеры, но объект отображается неправильно в плоскости изображения. Я вижу это за пределами плоскости изображения (проверено в 3D-виде.
Вот что я делаю:
Внутренние характеристики: использование значений, предоставленных ARKit ( fx, fy, cx, cy), где фокусные расстояния указаны в пикселях, а главная точка (cx, cy) смещена от верхнего левого угла изображения.
Поза: Используя Матрица позы 4x4, предоставленная ARKit (simd_float4x4) для положения и ориентации камеры в мире.
Визуализация: использование Pyrender для визуализации объекта с помощью IntrinsicsCamera и заданной матрицы позы.
Я также пробовал нормализовать внутренние параметры (cx, cy) относительно размеров изображения, но проблема с выравниванием не устранена.
Есть ли что-нибудь? Мне не хватает данных о положении камеры ARKiT?
Вот код, который я использую для захвата ARKiT:
private func createFrameMetadata(
frame: ARFrame,
depthFileName: String,
rgbFileName: String,
depthResolution: [Int],
objPosition: [Float]
) -> [String: Any] {
let timestamp = frame.timestamp
let intrinsics = frame.camera.intrinsics
let fx = intrinsics.columns.0.x
let fy = intrinsics.columns.1.y
let cx = intrinsics.columns.2.x
let cy = intrinsics.columns.2.y
let widthRGB = CVPixelBufferGetWidth(frame.capturedImage)
let heightRGB = CVPixelBufferGetHeight(frame.capturedImage)
let transform = frame.camera.transform
let pose4x4: [Float] = [
transform.columns.0.x, transform.columns.0.y, transform.columns.0.z, transform.columns.0.w,
transform.columns.1.x, transform.columns.1.y, transform.columns.1.z, transform.columns.1.w,
transform.columns.2.x, transform.columns.2.y, transform.columns.2.z, transform.columns.2.w,
transform.columns.3.x, transform.columns.3.y, transform.columns.3.z, transform.columns.3.w
]
return [
"timestamp": timestamp,
"intrinsics": [fx, fy, cx, cy, 0],
"depth": depthFileName,
"image": rgbFileName,
"pose4x4": pose4x4,
"resolution": [widthRGB, heightRGB],
"depthResolution": depthResolution,
"objPosition": objPosition // [x, y, z]
]
}
И код Python:
import numpy as np
import trimesh
import pyrender
import matplotlib.pyplot as plt
fuze_trimesh = trimesh.load(
'./3D_models/teapot.obj')
fuze_trimesh.apply_scale(0.006)
mesh = pyrender.Mesh.from_trimesh(fuze_trimesh)
scene = pyrender.Scene()
scene.add(mesh)
# data comes from ARKiT (real Data)
fx = 1350.447509765625
fy = 1350.447509765625
cx = 956.402587890625
cy = 728.2923583984375
pose = np.array([
0.96495628356933594,
0.037732210010290146,
0.25968354940414429,
0,
-0.00015643320512026548,
0.98969066143035889,
-0.14322151243686676,
0,
-0.26241043210029602,
0.13816189765930176,
0.95501405000686646,
0,
-0.17561252415180206,
-0.0080626010894775391,
0.22842416167259216,
1
])
camera = pyrender.IntrinsicsCamera(
fx=fx, cx=cx, fy=fy, cy=cy)
pose = np.reshape(pose, (4, 4))
pose = np.transpose(pose)
# Apply rotations
pose_landscape_right = pose # No change
camera_pose = pose
scene.add(camera, pose=camera_pose)
light = pyrender.DirectionalLight(
color=np.array([1.0, 1.0, 1.0]), intensity=5.0)
scene.add(light, pose=camera_pose)
r = pyrender.OffscreenRenderer(1920, 1440)
pyrender.Viewer(scene)
Подробнее здесь: https://stackoverflow.com/questions/793 ... insics-and
Почему моя проекция 3D-объекта не совпадает в Pyrender с внутренними функциями и позой ARKit? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Есть ли разница между SVML и нормальными внутренними квадратными корневыми функциями?
Anonymous » » в форуме C++ - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Подпись HMAC не совпадает и не принимается API AROFLO в коде PHP, но совпадает через Node.js.
Anonymous » » в форуме Php - 0 Ответы
- 48 Просмотры
-
Последнее сообщение Anonymous
-