openCV image Сшивание под широким углом 160 градусов

Я пытаюсь совместить изображение с широким углом обзора 160,5 градусов, но результат не очень хороший.

я использую OpenCV 4 и ffmpeg для получения кадров из видео

Команда ffmpeg для получения 15 кадров в секунду:

ffmpeg -i first.mp4 -vf fps=15  preview%05d.jpg

Код сшивания OpenCV

import cv2
import numpy as np

images = []
for i in range(70):
    name = ('preview%05d.jpg' % (i+1))
    print(name)
    images.append(cv2.imread(name , cv2.IMREAD_COLOR))


print("start ")
stitcher = cv2.Stitcher_create()
ret, pano = stitcher.stitch(images)

if ret == cv2.STITCHER_OK:
    cv2.imshow('panorama', pano)
    cv2.waitKey()
    cv2.destroyAllWindows()
else:
    print(cv2.STITCHER_ERR_NEED_MORE_IMGS)
    print(cv2.STITCHER_ERR_HOMOGRAPHY_EST_FAIL)
    print(cv2.STITCHER_ERR_CAMERA_PARAMS_ADJUST_FAIL)
    print(ret)
    print('Error during stiching')

фактический результат :

введите здесь описание изображения

ожидаемый результат :

введите здесь описание изображения


person a.masri    schedule 30.11.2019    source источник
comment
вы можете показать входные изображения?   -  person Micka    schedule 13.12.2019
comment
@Micka, конечно, это мое видео drive.google.com/file/ d/1ZfumOnuWY7QcFrVXj3yR8qU8TJacgKmA/ . я использую эту команду для извлечения изображений из видео ffmpeg -i first.mp4 -vf fps=15 preview%05d.jpg   -  person a.masri    schedule 14.12.2019


Ответы (2)


Перед строкой кода stitcher = cv2.Stitcher_create() вы должны добавить еще несколько алгоритмов, которые преобразуют ваше трапециевидное изображение в прямоугольное изображение через метод гомографии.

использовать: cv2.findHomography(srcPoints, dstPoints[, method[, ransacReprojThreshold[, mask]]])

  • srcPoints — координаты точек исходной плоскости, матрица типа CV_32FC2 или вектор.
  • dstPoints — координаты точек на целевой плоскости, матрица типа CV_32FC2 или вектор.

См. также здесь для findHomography в OpenCV.

В частности: в вашем случае база (нижняя сторона изображения) показывает большую часть информации, тогда как верхняя сторона содержит больше нерелевантной информации. Здесь вы должны сохранить одинаковое соотношение сторон сверху и сузить низ. Это должно быть сделано для каждого изображения. После этого вы можете попробовать сшить их снова.

Пример подхода к преобразованию информации об изображении на основе Trapezium, например. квадратное изображение:

                 (information ratio x)
----+++++++----  (1)
---+++++++++---  (1)
--+++++++++++--  (1)
-+++++++++++++-  (1)
+++++++++++++++  (1)

в квадратную информацию об изображении:

                (information ratio x)
----+++++++---- (1)
----+++++++---- (1.1)
----+++++++---- (1.2)
----+++++++---- (1.3)
----+++++++---- (1.4; most compressed information ratio)

Как только это будет сделано, вы можете сшить его. Не забудьте опубликовать результат ;-)

Другой подход состоит в том, чтобы обращаться с камерой как с линейным инспектором. Этот метод вы используете, когда берете информацию из каждого изображения, скажем, для строки от y1060 до 1080 (например, размер изображения 1920x1080 пикселей), а затем заполняете новый массив информацией из этих 20 строк в порядке возрастания.

Обновление от января 2019 г.:

Поскольку гомография, похоже, не выполняет работу на 100% из-за крутого угла в 60 градусов, вы можете попытаться исправить угол, выполнив сначала PerspectiveTransform.

# you can add a for-loop + image counter here to perform action on all images taken from
# the movie-file. Then its easily replacing numbers in the next part for the name
# of the image.

scr_array = []  # source e.g. pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
dest_array = [] # destination e.g. pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])

Matrix1 = cv2.getPerspectiveTransform(scr_array,dest_array)
dst = cv2.warpPerspective(image, Matrix1 , (cols, rows))

label = 'CarImage1' # use ('CarImage%s' % labelnr) here for automated annotation.

# cv2.imshow(label , dst) # check the image
# cv2.imwrite(('%s.jpg' % label), dst) 

См. также документы здесь по PerspectiveTransform.

person ZF007    schedule 17.12.2019
comment
спасибо за ваш ответ, вы можете посмотреть на видео еще раз? - person a.masri; 03.01.2020
comment
С видео есть две проблемы, на мой первый взгляд, что видео снято под углом около шестидесяти градусов, и используется как камера "рыбий глаз". Я пытался применить ваше решение, но оно не сработало - person a.masri; 03.01.2020

Stither ожидает изображения, которые имеют схожие части (вплоть до некоторой трансформации перспективы). Он выполняет попарную регистрацию изображений, чтобы найти это перспективное преобразование. В вашем случае он не сможет его найти, потому что его просто не существует.

Дополнительный шаг, который вы должны выполнить перед сшивкой, - исправить каждое изображение, чтобы исправить широкоугольное искажение. Чтобы найти параметры выпрямления, вам нужно будет выполнить некоторые калибровки камеры с калибровочными мишенями.

person Michael Burdinov    schedule 01.12.2019