Как я могу получить изображение на 360 градусов из трех неперекрывающихся изображений с углом обзора 120 градусов?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу получить изображение на 360 градусов из трех неперекрывающихся изображений с углом обзора 120 градусов?

Сообщение Anonymous »

Я пытаюсь соединить или спроецировать 3 изображения с 3 камер с углом обзора 120 градусов, которые были выровнены так, чтобы идеально охватывать угол обзора 360 градусов. Они не перекрываются, поэтому обычные методы сшивания с использованием класса OpenCV Stitcher не будут работать, поскольку основаны на перекрытии и обнаружении совпадающих точек сферы между изображениями. Базовая конкатенация также не работает, поскольку их необходимо деформировать или проецировать на цилиндр, чтобы получить правильное изображение на 360 градусов.
Код настройки камеры:

Код: Выделить всё

def create_camera_setup(world, blueprint_library, vehicle):
# Create a camera blueprint
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute('fov', '120')
camera_bp.set_attribute('image_size_x', '1024')
camera_bp.set_attribute('image_size_y', '728')

# Set up forward-facing cameras
camera_left = spawn_camera(world, camera_bp, vehicle, carla.Transform(
carla.Location(x=0.2, y=-0.3, z=1.3),
carla.Rotation(pitch=0, yaw=-60, roll=0)
))
camera_right = spawn_camera(world, camera_bp, vehicle, carla.Transform(
carla.Location(x=0.2, y=0.3, z=1.3),
carla.Rotation(pitch=0, yaw=60, roll=0)
))

# Set up rear-facing camera
camera_rear = spawn_camera(world, camera_bp, vehicle, carla.Transform(
carla.Location(x=0.2, y=0, z=1.3),
carla.Rotation(pitch=0, yaw=180, roll=0)
))

# Set up IMU
imu_bp = blueprint_library.find('sensor.other.imu')
imu = world.spawn_actor(imu_bp, carla.Transform(carla.Location(x=1.6, y=0, z=1.7)), attach_to=vehicle)

# Set up GPS
gps_bp = blueprint_library.find('sensor.other.gnss')
gps = world.spawn_actor(gps_bp, carla.Transform(carla.Location(x=1.6, y=0, z=1.7)), attach_to=vehicle)

return {
'camera_left': camera_left,
'camera_right': camera_right,
'camera_rear': camera_rear,
'imu': imu,
'gps': gps
}
Текущее простое объединение изображений:

Код: Выделить всё

def create_360_view(camera_left, camera_right, camera_rear):
left_img = camera_left.get_data()
right_img = camera_right.get_data()
rear_img = camera_rear.get_data()

combined_img = np.concatenate((left_img, right_img, rear_img), axis=1)
return combined_img

def display_image(display, image):
surface = pygame.surfarray.make_surface(image.swapaxes(0, 1))
display.blit(surface, (0, 0))
pygame.display.flip()
Соотношение сторон камеры: угол обзора 120 градусов, 1024x728
Результирующее изображение:
https://ibb.co/FnFhBcp
Я попробовал некоторые преобразования, как показано ниже, но при проецировании между изображениями есть промежутки:

Код: Выделить всё

def create_360_view(camera_left, camera_right, camera_rear):
left_img = camera_left.get_data()
right_img = camera_right.get_data()
rear_img = camera_rear.get_data()

height, width = left_img.shape[:2]

panorama_width = width * 3
panorama = np.zeros((height, panorama_width, 3), dtype=np.uint8)

place_image_cylindrical(panorama, left_img, 0, width)
place_image_cylindrical(panorama, right_img, width, width)
place_image_cylindrical(panorama, rear_img, 2*width, width)

return panorama

def place_image_cylindrical(panorama, img, start_x, width):
height, img_width = img.shape[:2]
cylinder_radius = width / (2 * np.pi / 3)  # 120 degrees = 2π/3 radians

theta = np.linspace(-np.pi/3, np.pi/3, width)
h = np.arange(height) - height // 2
theta, h = np.meshgrid(theta, h)

x = np.round(cylinder_radius * np.tan(theta) + img_width / 2).astype(int)
y = np.round(h * np.cos(theta) + height / 2).astype(int)

mask = (x >= 0) & (x < img_width) & (y >= 0) & (y < height)

panorama_x = np.round(theta * width / (2*np.pi/3) + start_x).astype(int)
panorama_y = h + height // 2

valid_mask = mask & (panorama_x >= 0) & (panorama_x < panorama.shape[1]) & (panorama_y >= 0) & (panorama_y < panorama.shape[0])

panorama[panorama_y[valid_mask], panorama_x[valid_mask]] = img[y[valid_mask], x[valid_mask]]
Результирующее изображение:
https://ibb.co/Mk2FXtV

Подробнее здесь: https://stackoverflow.com/questions/789 ... fov-images
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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