Искажение при преобразовании равноугольной панорамы в перспективное изображение.Python

Программы на Python
Ответить
Anonymous
 Искажение при преобразовании равноугольной панорамы в перспективное изображение.

Сообщение 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


Подробнее здесь: https://stackoverflow.com/questions/792 ... tive-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»