Я работаю с репозиторием неявной глубины от 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
Программы на Python
1735464029
Anonymous
Я работаю с репозиторием неявной глубины от 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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79315299/why-is-my-3d-object-projection-misaligned-in-pyrender-with-arkit-intrinsics-and[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия