100均Webカメラ2台でステレオマッチングやってみた
数ヶ月前に100均で入手して箱に入ったまま眠っていた2台のカメラで、ステレオマッチングしてみました。
2つのカメラの視差によって奥行き情報を算出するってことですね。
あまりややこしいことはしていません。 キャリブレーションせずにステレオマッチングの結果を静止画像で表示しています。
左上の黒い2つのカメラなんですが実は単体で簡単な3Dカメラらしく、付属の専用ソフトと3Dメガネ(青と赤のフィルター)を使用すれば、3D画像が楽しめる、、、が、購入動機は単に安かったからです。
ソース
最近Python使い始めました。さっと書いて実行できて速度的にも特に問題ないから便利ですね。
Python 2.7 + OpenCV 2.4.10 + NumPy + SciPy + matplotlib
カメラ2台の画質があまりにも違っていたので、念のためヒストグラムの平均化とガウシアンブラーで、差を目立たなくしています。品質が安定しているカメラなら、そのまま処理してもOKかと思います。
使い方
実行すると左右の画像が表示されます。終了するにはq
を、ステレオマッチングを行うにはd
をおします。
コマンドライン
python depth.py <idxCamL> <idxCamR> <ndisparities> <SADWindowSize>
パラメータ
- idxCamL - 左のカメラのインデックス(OpenCVのデバイスインデックス)
- idxCamR - 右のカメラのインデックス
- ndisparities - 視差サイズ
- SADWindowSize - 平均化Windowサイズ
実行結果
以下、上の写真のカメラの状態で、視差サイズを16、平均化ウィンドウサイズを21にして実行した結果です。
入力画像
汚部屋の背後の壁に、古い自転車のフレームと、ホイールを吊っている図。壁とホイールの距離は30cmくらいです。
左右を入れ替えていますので、交差法(より目)で見れば立体に見えます。
出力画像
なんかちょっとおぞましい感じに見えますが、簡単に表示するとこうなるってことでしょう。
わかったようなわからないような表示ですけど、奥行き情報が得られているのは確かなようです。
2台のカメラの配置など、もっと厳密に決めるべきかと思っていたのですが、ざっくりでも十分でした。
表示方法を工夫すれば結果がわかりやすいかもしれません。 リアルタイムにパラメータの調整や結果表示ができるといいかも。