Python/OpenCV: вычисление карты глубины из стереоизображений

У меня есть два стереоизображения, которые я хотел бы использовать для вычисления карты глубины. К сожалению, я не знаю C/C++, но знаю python--, поэтому, когда я нашел этот урок, я был настроен оптимистично.

К сожалению, учебник выглядит несколько устаревшим. Его нужно не только настроить, чтобы он вообще запускался (переименовывая "createStereoBM" в "StereoBM"), но когда он все-таки работает, он не дает хорошего результата, даже на примерах стереоизображений, которые использовались в самом учебнике.

Вот пример:

image-left image-right

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

imgL = cv2.imread('Yeuna9x.png',0)
imgR = cv2.imread('SuXT483.png',0)

stereo = cv2.StereoBM(1, 16, 15)
disparity = stereo.compute(imgL, imgR)

plt.imshow(disparity,'gray')
plt.show()

Результат:

the result

Это сильно отличается от того, чего достиг автор урока:

good result
(источник: opencv.org)

Настройка параметров не улучшает ситуацию. Вся документация, которую я смог найти, относится к исходной C-версии кода openCV, а не к эквиваленту библиотеки Python. К сожалению, я не смог использовать это для улучшения ситуации.

Любая помощь будет оценена!

Ответ 1

У вас неправильные образы.

Посмотрите на изображения, олово за лампой позволяет вам определять расположение камер двух изображений,

Просто измените это:

#  v
imgR = cv2.imread('Yeuna9x.png',0)
imgL = cv2.imread('SuXT483.png',0)
#  ^

Если вы посмотрите на изображение в учебнике, которое, по их словам, является фреймом left, оно будет таким же, как ваш right.

Здесь мой результат после изменения.

enter image description here

Ответ 2

Возможно, вам нужно постоянно корректировать параметры алгоритма соответствия блоков.

взгляните на эту статью в блоге: https://erget.wordpress.com/2014/03/13/building-an-interactive-gui-with-opencv/

Автор статьи составил набор классов, чтобы сделать процесс калибровки камер более упорядоченным, чем учебник opencv. Эти классы доступны в виде пакета pypi: https://github.com/erget/StereoVision

Надеюсь, что это поможет:)

Ответ 3

Камера преобразуется вертикально, а не горизонтально. Поверните изображения на 90 градусов, затем попробуйте. (Докажите это себе, повернув экран. Я просто взял свой ноутбук и повернул его на край.)

Вы упомянули другое программное обеспечение; возможно, основной вид строки/столбца между оригиналом и pyOpenCV.