Мне нужно на лету сшить пять видеопотоков. Камеры, записывающие видео, устанавливаются на стойку бок о бок и никогда не изменят своего положения относительно друг друга. Таким образом, матрицы гомографии статичны.
Я следую подходу из этого репозитория github:
Начиная с центрального изображения, вы сначала сшиваете слева, а затем сшиваете остальные изображения справа.
Код из этого репозитория работает, но очень медленно. Мне удалось значительно улучшить его производительность (коэффициент 300), но по-прежнему требуется 0,25 секунды, чтобы сшить панораму из пяти изображений (на Macbook Pro 2015 года).
Медленная часть: применение каждого результата cv2.warpPerspective(...)
к изображениям, сшитым до этого момента. В настоящее время я делаю это, используя альфа-канал и смешивая два изображения, вдохновленные это ТАК ответ. Именно это смешивание замедляет сшивку.
(Псевдо) код:
def blend_transparent(background, foreground):
overlay_img = foreground[:, :, :3] # Grab the BRG planes
overlay_mask = foreground[:, :, 3:] # And the alpha plane
# Again calculate the inverse mask
background_mask = 255 - overlay_mask
# Turn the masks into three channel, so we can use them as weights
overlay_mask = cv2.cvtColor(overlay_mask, cv2.COLOR_GRAY2BGR)
background_mask = cv2.cvtColor(background_mask, cv2.COLOR_GRAY2BGR)
# Create a masked out background image, and masked out overlay
# We convert the images to floating point in range 0.0 - 1.0
background_part = (background * (1 / 255.0)) * (background_mask * (1 / 255.0))
overlay_part = (overlay_img * (1 / 255.0)) * (overlay_mask * (1 / 255.0))
# And finally just add them together, and rescale it back to an 8bit integer image
return np.uint8(
cv2.addWeighted(background_part, 255.0, overlay_part, 255.0, 0.0)
)
for image in right_images:
warped_image = cv2.warpPerspective(image, ...)
mask = np.zeros(
(warped_image.shape[0], warped_image.shape[1], 4),
dtype="uint8"
)
mask[0 : previously_stitched.shape[0], 0 : previously_stitched.shape[1]] = previously_stitched
mask_rgb = mask[:, :, :3] # Grab the BRG planes
previously_stitched = blend_transparent(mask_rgb, warped_image)
Итак, мой вопрос: есть ли способ более эффективно применить деформированное изображение к существующей панораме?
Мой полный рабочий код находится в в этом репозитории.
Отказ от ответственности: я веб-разработчик, и мои знания о компьютерном зрении очень ограничены.
requirements.txt
, рассматриваемый алгоритм будет включен. - person creimers   schedule 10.01.2019