2014-12-31 10 views
11

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

К сожалению, учебное пособие выглядит несколько устаревшим. Он не только нуждается в настройке для запуска вообще (переименование «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 http://docs.opencv.org/trunk/_images/disparity_map.jpg

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

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

+0

только для записи, учебник из будущего (opencv3.0), но да, это устаревшее. для текущего 3.0 вам нужно будет использовать cv2.StereoBM_create() или cv2.StereoSGBM_create(). – berak

+0

cv2.StereoBM, похоже, существует, но с использованием cv2.StereoBM_create() или cv2.StereoSGBM_create() выдает ошибку (ошибка атрибута). – jwdink

+0

, вы, очевидно, используете opencv2.4, а не 3.0 – berak

ответ

-1

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

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

+0

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

+0

Я думаю, что это всего лишь форматирование вопроса ... Изображения с двух точек зрения разделены горизонтально. – will

+0

Кроме того, если бы это было так, то это не имело бы значения, вам просто нужно было бы поставить * нижнее изображение налево (поверните рамку отсчета). Вращение каждого изображения по отдельности фактически остановило бы его работу. – will

1

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

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

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

Надеется, что это помогает :)

15

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

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

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

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

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

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

enter image description here

Смежные вопросы