銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

100均Webカメラ2台でステレオマッチングやってみた

数ヶ月前に100均で入手して箱に入ったまま眠っていた2台のカメラで、ステレオマッチングしてみました。

2つのカメラの視差によって奥行き情報を算出するってことですね。

あまりややこしいことはしていません。 キャリブレーションせずにステレオマッチングの結果を静止画像で表示しています。

f:id:takamints:20141103152657j:plain


LOGICOOL ウェブカム HD画質 120万画素 C270
ロジクール (2010-08-20)
売り上げランキング: 124

左上の黒い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くらいです。

f:id:takamints:20141103162805p:plain

左右を入れ替えていますので、交差法(より目)で見れば立体に見えます。

出力画像

なんかちょっとおぞましい感じに見えますが、簡単に表示するとこうなるってことでしょう。

f:id:takamints:20141103153204p:plain

わかったようなわからないような表示ですけど、奥行き情報が得られているのは確かなようです。

2台のカメラの配置など、もっと厳密に決めるべきかと思っていたのですが、ざっくりでも十分でした。

表示方法を工夫すれば結果がわかりやすいかもしれません。 リアルタイムにパラメータの調整や結果表示ができるといいかも。

OpenCV画像処理関連記事

takamints.hatenablog.jp

takamints.hatenablog.jp

takamints.hatenablog.jp

takamints.hatenablog.jp


参考サイト