深度マップの計算に使用したい2つのステレオ画像があります。残念ながら私はC/C++を知りませんが、python--を知っています。そのため、 このチュートリアル を見つけたとき、私は楽観的でした。
残念ながら、チュートリアルは多少古くなっているようです。実行するために微調整する必要があるだけでなく(名前を「createStereoBM」から「StereoBM」に変更)、実行しても、チュートリアル自体で使用されたステレオ画像の例でさえ、良い結果が得られません。
次に例を示します。
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()
結果:
これは、チュートリアルの作成者が達成するものとは大きく異なります。
(ソース: opencv.org )
パラメータを微調整しても問題は改善されません。私が見つけたすべてのドキュメントは、openCVコードの元のCバージョン用であり、python-library-equivalentではありません。残念ながら、これを使って物事を改善することはできませんでした。
どんな助けもいただければ幸いです!
画像の向きが間違っています。
画像を見てください。ランプの後ろにある缶を使用すると、2つの画像のカメラ位置を確認できます。
これを変更するだけです:
# v
imgR = cv2.imread('Yeuna9x.png',0)
imgL = cv2.imread('SuXT483.png',0)
# ^
チュートリアルでleft
フレームと言っている画像を見ると、right
のものと同じです。
これが変更後の私の結果です。
ブロックマッチングアルゴリズムのパラメーターを調整し続ける必要がある可能性があります。
このブログ記事をご覧ください: https://erget.wordpress.com/2014/03/13/building-an-interactive-gui-with-opencv/
記事の作成者は、カメラのキャリブレーションプロセスをopencvチュートリアルよりも効率化するために一連のクラスを構成しています。これらのクラスはpypiパッケージとして利用できます: https://github.com/erget/StereoVision
お役に立てれば :)