Стерео выпрямление с OpenCV 4.2.0 - PullRequest
0 голосов
/ 27 марта 2020

Я уже делаю исправление с моим собственным кодом. Теперь я пытаюсь заставить cv2.stereoRectify работать.

Предположим, у меня есть следующий код:

import numpy as np
import cv2

img1 = cv2.imread(IMG_LEFT) # Load image left
img2 = cv2.imread(IMG_RIGHT) # Load image right

A1 = np.array(A1) # Left camera matrix intrinsic
A2 = np.array(A2) # Right camera matrix intrinsic

RT1 = np.array(RT1) # Left camera extrinsic (3x4)
RT2 = np.array(RT2)  # Right camera extrinsic (3x4)

# Original projection matrices
Po1 = A1.dot( RT1 )
Po2 = A2.dot( RT2 )

# Camera centers (world coord.)
C1 = -np.linalg.inv(Po1[:,:3]).dot(Po1[:,3])
C2 = -np.linalg.inv(Po2[:,:3]).dot(Po2[:,3])

# Transformations
T1to2 = C2 - C1 # Translation from first to second camera
R1to2 = RT2[:,:3].dot(np.linalg.inv(RT1[:,:3])) # Rotation from first to second camera (3x3)

Затем я хотел бы найти преобразования выпрямления (3x3). Следуя документации OpenCV Я пытаюсь:

Rectify1, Rectify2, Pn1, Pn2, _, _, _ = cv2.stereoRectify(A1, np.zeros((1,5)), A2, np.zeros((1,5)), (img1.shape[1], img1.shape[0]), R1to2, T1to2, alpha=-1 )


mapL1, mapL2 = cv2.initUndistortRectifyMap(A1, np.zeros((1,5)), Rectify1, Pn1, (img1.shape[1], img1.shape[0]), cv2.CV_32FC1)
mapR1, mapR2 = cv2.initUndistortRectifyMap(A2, np.zeros((1,5)), Rectify2, Pn2, (img2.shape[1], img2.shape[0]), cv2.CV_32FC1)

img1_rect = cv2.remap(img1, mapL1, mapL2, cv2.INTER_LINEAR)
img2_rect = cv2.remap(img2, mapR1, mapR2, cv2.INTER_LINEAR)

В любом случае я получаю полностью испорченные изображения, конечно же, не исправленные. Что я делаю неправильно? Я предполагаю, что это что-то о вращениях / переводах, но я не могу понять это.

Кроме того, OpenCV немного слишком сложен по этому поводу? В любом случае это должна быть простая операция.

Большое спасибо.

РЕДАКТИРОВАТЬ: Вы можете заметить, что я установил параметры искажения на ноль. Это потому, что я использую компьютерные стереоизображения без искажений объектива.

1 Ответ

0 голосов
/ 22 апреля 2020

Копаясь в документации OpenCV Я нашел причину, по которой stereoRectify(), похоже, не работает.

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

Итак, после Вызов:

R1, R2, Pn1, Pn2, _, _, _ = cv2.stereoRectify(A1, np.zeros((1,5)), A2, np.zeros((1,5)), (img1.shape[1], img1.shape[0]), R1to2, T1to2, alpha=-1 )

Чтобы получить преобразования выпрямления, я использую:

Rectify1 = R1.dot(np.linalg.inv(A1))
Rectify2 = R2.dot(np.linalg.inv(A2))

Где R1 и R2 - выходные данные преобразований OpenCV и A1 и A2 Матрицы камеры 3х3 (встроенные).

Кажется, все работает нормально. Пожалуйста, прокомментируйте, если у вас есть идея получше

...