Учитывая равнопрямоугольную панораму (соотношение сторон 2:1, разрешение 4000x2000), ориентацию камеры, желаемую форму изображения и двухмерное поле зрения, я пытаюсь преобразовать ее в перспективное изображение. В зависимости от вектора ориентации перспективное изображение будет либо выглядеть правильно, либо быть повернуто неправильно и искажено.
[img]https://i. sstatic.net/65E9vvlB.png[/img]
Ориентации, которые выглядят неправильно, — это те, которые имеют компоненты x и y. Все остальные ориентации, которые я тестировал, выглядят правильно. Вы хоть представляете, какая часть моего кода вызывает эту проблему?
def calculate_R(orientation, up=cp.array([0, -1, 0])):
orientation = orientation / cp.linalg.norm(orientation)
if cp.allclose(orientation, up):
return cp.array([[1, 0, 0], [0, 0, 1], [0, -1, 0]])
if cp.allclose(orientation, -up):
return cp.array([[1, 0, 0], [0, 0, -1], [0, 1, 0]])
x = cp.cross(up, orientation)
x = x / cp.linalg.norm(x)
y = cp.cross(orientation, x)
y = y / cp.linalg.norm(y)
R = cp.array([x, y, orientation])
return R
def rotate_xyz(R, x, y, z):
xyz = cp.stack((x.ravel(), y.ravel(), z.ravel()))
x, y, z = cp.matmul(R, xyz).reshape(3, *x.shape)
return x, y, z
def transform_back(pano, orientation, image_shape, fov=[90, 90]):
orientation = orientation / cp.linalg.norm(orientation)
focal_length_x = (image_shape[1] / 2) / cp.tan(cp.radians(fov[0]) / 2)
focal_length_y = (image_shape[0] / 2) / cp.tan(cp.radians(fov[1]) / 2)
x = cp.linspace(-image_shape[1] / 2, image_shape[1] / 2, num=image_shape[1]) / focal_length_x
y = cp.linspace(-image_shape[0] / 2, image_shape[0] / 2, num=image_shape[0]) / focal_length_y
z = - cp.ones_like(x)
x, y = cp.meshgrid(x, y)
R = calculate_R(orientation)
x, y, z = Panorama.rotate_xyz(R, x, y, z)
xyz = cp.stack([x, y, z], axis=-1).reshape(-1, 3)
lon = cp.arctan2(xyz[:, 0], xyz[:, 2])
lat = cp.arcsin(xyz[:, 1] / cp.linalg.norm(xyz, axis=1))
u = ((lon + cp.pi) / (2 * cp.pi)) * pano.shape[1]
v = ((cp.pi / 2 - lat) / cp.pi) * pano.shape[0]
u = u.reshape(image_shape[0], image_shape[1]).astype(cp.float32)
v = v.reshape(image_shape[0], image_shape[1]).astype(cp.float32)
image = cp.empty((image_shape[0], image_shape[1], pano.shape[2]), dtype=pano.dtype)
for i in range(pano.shape[2]):
image[:, :, i] = ndimage.map_coordinates(pano[:, :, i], cp.stack([v, u]), order=1, mode='wrap')
return image
Подробнее здесь: https://stackoverflow.com/questions/792 ... tive-image
Искажение при преобразовании равноугольной панорамы в перспективное изображение. ⇐ Python
Программы на Python
1732300605
Anonymous
Учитывая равнопрямоугольную панораму (соотношение сторон 2:1, разрешение 4000x2000), ориентацию камеры, желаемую форму изображения и двухмерное поле зрения, я пытаюсь преобразовать ее в перспективное изображение. В зависимости от вектора ориентации перспективное изображение будет либо выглядеть правильно, либо быть повернуто неправильно и искажено.
[img]https://i. sstatic.net/65E9vvlB.png[/img]
Ориентации, которые выглядят неправильно, — это те, которые имеют компоненты x и y. Все остальные ориентации, которые я тестировал, выглядят правильно. Вы хоть представляете, какая часть моего кода вызывает эту проблему?
def calculate_R(orientation, up=cp.array([0, -1, 0])):
orientation = orientation / cp.linalg.norm(orientation)
if cp.allclose(orientation, up):
return cp.array([[1, 0, 0], [0, 0, 1], [0, -1, 0]])
if cp.allclose(orientation, -up):
return cp.array([[1, 0, 0], [0, 0, -1], [0, 1, 0]])
x = cp.cross(up, orientation)
x = x / cp.linalg.norm(x)
y = cp.cross(orientation, x)
y = y / cp.linalg.norm(y)
R = cp.array([x, y, orientation])
return R
def rotate_xyz(R, x, y, z):
xyz = cp.stack((x.ravel(), y.ravel(), z.ravel()))
x, y, z = cp.matmul(R, xyz).reshape(3, *x.shape)
return x, y, z
def transform_back(pano, orientation, image_shape, fov=[90, 90]):
orientation = orientation / cp.linalg.norm(orientation)
focal_length_x = (image_shape[1] / 2) / cp.tan(cp.radians(fov[0]) / 2)
focal_length_y = (image_shape[0] / 2) / cp.tan(cp.radians(fov[1]) / 2)
x = cp.linspace(-image_shape[1] / 2, image_shape[1] / 2, num=image_shape[1]) / focal_length_x
y = cp.linspace(-image_shape[0] / 2, image_shape[0] / 2, num=image_shape[0]) / focal_length_y
z = - cp.ones_like(x)
x, y = cp.meshgrid(x, y)
R = calculate_R(orientation)
x, y, z = Panorama.rotate_xyz(R, x, y, z)
xyz = cp.stack([x, y, z], axis=-1).reshape(-1, 3)
lon = cp.arctan2(xyz[:, 0], xyz[:, 2])
lat = cp.arcsin(xyz[:, 1] / cp.linalg.norm(xyz, axis=1))
u = ((lon + cp.pi) / (2 * cp.pi)) * pano.shape[1]
v = ((cp.pi / 2 - lat) / cp.pi) * pano.shape[0]
u = u.reshape(image_shape[0], image_shape[1]).astype(cp.float32)
v = v.reshape(image_shape[0], image_shape[1]).astype(cp.float32)
image = cp.empty((image_shape[0], image_shape[1], pano.shape[2]), dtype=pano.dtype)
for i in range(pano.shape[2]):
image[:, :, i] = ndimage.map_coordinates(pano[:, :, i], cp.stack([v, u]), order=1, mode='wrap')
return image
Подробнее здесь: [url]https://stackoverflow.com/questions/79216209/distortion-in-transformation-from-equirectangular-panorama-to-perspective-image[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия