Как преобразовать FOV двух камер в одно отображаемое изображение с помощью гомографии

Я работаю над проектом, в котором мне нужно обнаруживать объекты (небольшие вагоны на железной дороге) с двух камер с неперекрывающимися видами с высоты птичьего полета (см. Ниже два изображения)

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

Как видите, автомобили обнаруживаются и возвращаются их координаты Centroid.

Однако я пытаюсь преобразовать два вида в одно изображение, представляющее только железную дорогу, по которой едет вагон.

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

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

Проведя некоторое исследование, я приземлился с помощью метода openCV под названием: cv2.findHomography(), который находит матрицу гомографии между двумя плоскостями.

Два изображения, поступающие с двух камер, соответственно имеют разрешение 1280x720. Для целевого изображения оно имеет разрешение 1440 x 480.

мой код написан следующим образом:

import numpy as np
import cv2

def Perspective_transf(src_point,h):
 a = np.array([src_point]) 
 a=np.array(a.transpose())
 a=np.vstack((a,np.array(1)))
 a_transformed_homo = np.dot(h,a)
 scale_factor=a_transformed_homo[2][0]
 a_transformed_euk=np.divide(a_transformed_homo,scale_factor)
 return a_transformed_euk

# Source points: from camera image which are the same as the two cameras have the same resolution 
pts_src=np.array([[0,0],[1280,0],[720,1280],[0,720],[640,360]])
#destination correspondences of the pts_src on the destination image (for camera 1)
pts_dst1=np.array([[0,0],[720,0],[720,480],[0,480],[360,240]])
#destination correspondences of the pts_src on the destination image (for camera2)
pts_dst2=np.array( [[720,0],[1440,0],[1440,480],[720,480],[1080,240]])

#homography between the first camera image plane and the destination image
h1, status1 = cv2.findHomography(pts_src, pts_dst1)
#homography between the second camera image plane and the destination image
h2, status1 = cv2.findHomography(pts_src, pts_dst2) 

Теперь, после этого, я оценил омографы, для каждого обнаруженного центроида я могу спроецировать (преобразовать) его на целевое изображение, используя омографы.

Когда я запускаю свой код, я получаю следующий результат:

результаты

Как вы можете видеть, траектории, созданные путем преобразования обнаруженного центра тяжести движения автомобиля из поля зрения одной камеры в поле зрения другой камеры, не выровнены с определенной траекторией, имитирующей железную дорогу, и повернуты по сравнению с изображением.

Итак, что я делаю неправильно и почему мои результаты выглядят так?

Заранее спасибо

Халед Джбейли


person Khaled    schedule 14.10.2020    source источник


Ответы (1)


Я решил это, просто добавив еще пару точек. Таким образом, ошибка обратной проекции сводится к минимуму.

person Khaled    schedule 08.11.2020