例によって、百均で購入した2台のWEBカメラをステレオキャリブレーションして、ステレオマッチングをやってみました。
低価格&低品質のウェブカメラで、マジメにキャリブレーションする意味なんてあるのかどうかわかりませんが、今後とも頑張ってやっていきます。いくつになってお勉強です。
高級ステレオカメラシステム(笑)紹介
今回から以下のように、カメラをキチンと固定しました。位置がずれたらキャリブレーション取り直しですからね。
押入れから引っ張り出してきた金属製のブックエンドに、そこらに転がっていたマスキングテープで固定しました。有り合わせ感たっぷりですが、これで充分機能してます。 カメラの後ろのはキャリブレーション用のチェスボードです。
ソフトウェア
全てGitHubに置いています。
利用している画像処理ライブラリについては以下を参照してください。
キャリブレーション機能
ステレオキャリブレーション
ステレオキャリブレーションには、位置関係が固定された2つのカメラと、チェスボードが必要です。 2つのカメラで同時にチェスボードを撮影した複数の画像からキャリブレーションするのです。
stereoShot - ステレオキャリブレーション画像保存ツール
位置関係が固定されているのに、毎回、キャリブレーション画像を撮影しなおすのは無駄ですから、事前に保存した画像を実行時に読み込んで、キャリブレーションするようにしています。
この画像を保存するツールが、stereoShotです。
stereoShotを実行すると左右のカメラ画像が表示されます。各カメラが11x9のチェスボードの内部の交点を検出したら、それぞれ画面に描画します。スペースバーを押せば、両方の画像をファイルへ保存します。
ステレオキャリブレーションのためには、両方のカメラでチェスボードの交点を検出している必要があることに注意してください__
画像ファイルの保存先
画像ファイルの保存先は、既定ではカレントディレクトリとなっています。画像ファイルは、cal_
という名前で始まります。これを変更するには-C
オプションを使用します。このオプションでサブフォルダに出力することも可能です。たとえば、stereoShot -C sub/cal
とすれば、サブディレクトリ sub
にcal_
で始まるファイルが保存されます。
画像は数10枚必要とのことですが、今のところ15セット(左右あわせて30枚)でなんとかなっているようです。
StereoBlockMatchでキャリブレーションを有効にする
stereoShotで保存したキャリブレーション画像を読み込んで、ステレオマッチングを行うには、StereoBlockMatchに、stereoShotと同様の-C
オプションを指定します。-Cを指定しない場合は、従来通りキャリブレーションなしでマッチングします。
パラメータ表示・変更機能
ステレオブロックマッチに使用するパラメータの多くを、実行中に変更できるようにしました。
変更可能なパラメータは画面の左上に表示されており、左端の一文字をキーボードから入力して、[+]
と[-]
で変更できます。変更は即時反映されます。
実行結果
以下は、キャリブレーションなしとありの結果です。パラメータは同一で、「あり」は各々のカメラ画像をキャリブレーション結果でremapしてるかどうかの違いだけです。 ウィンドウの左上が右側カメラで、右上が左側。交差法(より目)で見れば立体的に見えるはず。左下はStereoSGBMで得られた視差画像。右下は視差画像の15回の移動平均画像です。
若干細かい部分の精度が改善しているように思いますが、実際のところ、その差は微妙。
カメラの品質によるところが大きいと思いますが、撮影環境やパラメータの調整でも大きく結果が異なります。
あと、キャリブレーションの有無で出力画像のピクセルが反転していますね。
今後の課題
- ステレオマッチングのパラメータの理解
- キャリブレーションの正当性チェック
- 3次元画像の可視化コードのチェック
(1)パラメータは適当に決めているので、細かく調整しながら様子を見てみます。各々のパラメータの意味も、キチンと理解していません。 また、(2)キャリブレーションのやり方によると思うのですが、補正後の画像が大きく回転したりずれていたりすることがあり、その機序を理解していません。 それから、(3)視差画像の可視化についても、なんとなく適当にやっていますので、このあたりのチェックが必要かと思います。
所感など
キャリブレーションの有無で、あまり差が出なかったので、かなり動揺(笑)。
品質の安定したWEBカメラを買うかどうか思案中。百均は限界かな。