web-dev-qa-db-ja.com

Python / OpenCV:ステレオ画像から深度マップを計算する

深度マップの計算に使用したい2つのステレオ画像があります。残念ながら私はC/C++を知りませんが、python--を知っています。そのため、 このチュートリアル を見つけたとき、私は楽観的でした。

残念ながら、チュートリアルは多少古くなっているようです。実行するために微調整する必要があるだけでなく(名前を「createStereoBM」から「StereoBM」に変更)、実行しても、チュートリアル自体で使用されたステレオ画像の例でさえ、良い結果が得られません。

次に例を示します。

image-leftimage-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

パラメータを微調整しても問題は改善されません。私が見つけたすべてのドキュメントは、openCVコードの元のCバージョン用であり、python-library-equivalentではありません。残念ながら、これを使って物事を改善することはできませんでした。

どんな助けもいただければ幸いです!

13
jwdink

画像の向きが間違っています。

画像を見てください。ランプの後ろにある缶を使用すると、2つの画像のカメラ位置を確認できます。

これを変更するだけです:

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

チュートリアルでleftフレームと言っている画像を見ると、rightのものと同じです。

これが変更後の私の結果です。

enter image description here

20
will

ブロックマッチングアルゴリズムのパラメーターを調整し続ける必要がある可能性があります。

このブログ記事をご覧ください: https://erget.wordpress.com/2014/03/13/building-an-interactive-gui-with-opencv/

記事の作成者は、カメラのキャリブレーションプロセスをopencvチュートリアルよりも効率化するために一連のクラスを構成しています。これらのクラスはpypiパッケージとして利用できます: https://github.com/erget/StereoVision

お役に立てれば :)

0
samkhan13