Вычислить гомографию с учетом двух поз/преобразований камеры ARKitIOS

Программируем под IOS
Ответить
Гость
 Вычислить гомографию с учетом двух поз/преобразований камеры ARKit

Сообщение Гость »

Фон
Я хочу вычислить гомографию между произвольными изображениями, снятыми во время сеанса ARSession, чтобы можно было объединить изображения в панораму на 360 градусов с использованием цилиндрической/сферической проекции.

Для каждого изображения, снятого во время ARSession, у меня есть следующие метаданные, предоставленные ARKit:
[*]Внутренние характеристики камеры (фокусное расстояние, главная точка) [*]Преобразование камеры (положение и ориентация камеры в пространстве мировых координат)
Метаданные представлены в формате JSON следующим образом:

{ "трансформировать": [ [ [ 0,061746232, -0,62273073, -0,7799959, 0 ], [ 0,9924069, 0,12159537, -0,01851775, 0 ], [ 0,10637547, -0,7729301, 0,62551045, 0 ], [ -0,13529362, 0,21586405, 0,4334107, 1 ] ] ], "внутренности": [ [ [ 1447,54, 0, 0 ], [ 0, 1447,54, 0 ], [ 936.6673, 707.42883, 1 ] ] ], "eulerAngleY": 9.65149, "eulerAngleX": 50.617744, "eulerAngleZ": -78.951355 } Код для извлечения параметров камеры из заданных метаданных изображения и вычисления гомографии между двумя изображениями с использованием параметров камеры:

def extract_camera_params(метаданные): # Транспонировано, потому что ARKit использует матрицы с первым столбцом Transform = np.array(метаданные['transform'][0]).T # Извлечь матрицу вращения (3x3) и вектор перевода (3x1) R = преобразование[:3, :3] Т = трансформировать[:3, 3] # Транспонировано, потому что ARKit использует матрицы с первым столбцом K = np.array(метаданные['intrinsics'][0], dtype=np.float32).transpose() вернуть CameraParams(R, T, K) def FindHomography(BaseCameraParams, SecCameraParams): R1, tvec1, R2, tvec2, K = BaseCameraParams.R, BaseCameraParams.T, SecCameraParams.R, SecCameraParams.T, SecCameraParams.K R_1to2 = np.dot(R2, R1.T) tvec_1to2 = np.dot(R2, np.dot(-R1.T, tvec1)) + tvec2 нормальный = np.array([0, 0, 1]).reshape((3, 1)) нормальный1 = np.dot(R1, нормальный) d = нормальный1.T.dot(tvec1) homography_euclidean = R_1to2 + (np.outer(tvec_1to2,normal1.T)/d) print("Гомография Евклидова:\n", homoography_euclidean) print("\nK:\n", K) гомография = np.dot(np.dot(K, homoography_euclidean), np.linalg.inv(K)) гомография /= гомография[2, 2] print("\nГомография:\n", гомоография) вернуть гомографию Однако полученное сшитое изображение выглядит следующим образом:
Изображение

Мои вопросы [*]Есть ли логические ошибки в моей функции FindHomography? Я думаю, что мой код гомографии имеет некоторые серьезные логические ошибки, учитывая, что второе изображение даже отдаленно не совпадает с первым изображением. [*]Изображения ARKit захватываются в альбомной ориентации, даже если устройство находится в портретном режиме. Должен ли я изменить свой код, чтобы учесть это? Если да, то как? Для контекста в этой статье упоминается следующее:
Матрицу преобразования, также известную как поза камеры, можно получить с помощью преобразования свойства ARCamera. Он показывает положение и ориентацию камеры в мировой системе координат. Хитрость в том, что исходное положение камеры — горизонтальное вправо, а это означает, что если устройство удерживается в портретном режиме, матрица преобразования будет иметь соответствующий компонент вращения.
Приложения
Для остальной части процесса сшивания я использую этот репозиторий Github в качестве справочного материала: https://github.com/KEDIARAHUL135/PanoramaStitchingP2

Ссылки, используемые при вычислении гомографии по смещению камеры:
[*]https://docs.opencv.org/3.4.1/d9/dab/tu ... aphy_Demo3 [*]https://dsp.stackexchange.com/questions ... homography [*]Как вычислить гомографию по двум позам?
Ответить

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

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

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

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

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