2014-12-31 363 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

調整參數並不能改善問題。我所能找到的所有文檔都是針對openCV代碼的原始C版本,而不是python-library-equivalent。不幸的是,我無法使用它來改善事情。

任何幫助,將不勝感激!

+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

15

你有圖像周圍的錯誤的方式。

看圖像,燈背後的錫可以讓你的工作出兩幅圖像的相機定位,

只要改變這一點:

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

如果您在本教程看圖像他們說的是left這一幀,它與你的right一樣。

這是我改變後的結果。

enter image description here