Карта глубины OpenCV из стереоизображений с непараллельными эпилинами - PullRequest
0 голосов
/ 10 октября 2019

Я нашел учебник о получении карты глубины из стереоизображений , который содержит этот фрагмент кода:

import numpy as np
import cv2
from matplotlib import pyplot as plt

imgL = cv2.imread('tsukuba_l.png',0)
imgR = cv2.imread('tsukuba_r.png',0)

stereo = cv2.createStereoBM(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL,imgR)
plt.imshow(disparity,'gray')
plt.show()

Короткий вопрос:

Имеют ли эпиполярные линиибыть параллельным, чтобы этот алгоритм работал? У меня есть две камеры, которые действуют как стереосистема, но между ними есть небольшое вращение и перемещение, так как я просто положил их на стол. Так что мои эпилины далеко не параллельны.

1 Ответ

2 голосов
/ 10 октября 2019

Да, эпиполярные линии должны быть параллельными, чтобы createStereoBM работал.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...