2016年7月17日日曜日

openCVを利用したステレオカメラの作り方

USBカメラ2台でステレオカメラを作り、openCVで処理して深度を取得してみました。
備忘録として作り方と動作結果を共有します。

使ったもの

  • USBカメラ2台
  • ダンボール
  • python-opencvをインストールしたPC

カメラの準備

ざっくりと平行になるよう、ダンボールに固定します。


動作させながら角度を調整するため、完全固定はしません。

OpenCVのインストール

OpenCV2.7で良い場合はapt-getでインストールできます。
sudo apt-get install libopencv-dev
sudo apt-get install python-opencv
参考: Raspberry Pi B+にOpenCV-Python環境を構築する

OpenCV3系が良い方は、ソースからコンパイルしてください。
参考: Install OpenCV 3.0 and Python 2.7+ on Ubuntu

プログラム作成

pythonで作成しました。
カメラの番号(VideoCaptureの引数)はお使いの設定環境に合わせて変更してください。
下記のコマンドでダウンロードできます。
wget -O stereo.py https://gist.github.com/asukiaaa/1d8c9f8667c321265e83edab2bc5d4e9/raw

opencvのバージョンが2か3によってStereoSGBMや定数の呼び出し方法が違うので、このように対応しています。
if (opencv_measure_version <= 2):
  # for OpenCV2
  stereo = cv2.StereoSGBM(
    # ..
    SADWindowSize = 16,
    # ..
  )
  capL.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,  IMAGE_WIDTH)
  capL.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT)
  capR.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,  IMAGE_WIDTH)
  capR.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT)
else:
  # for OpenCV3
  stereo = cv2.StereoSGBM_create(
    # ..
    blockSize = 16,
    # ..
  )
  capL.set(cv2.CAP_PROP_FRAME_WIDTH,  IMAGE_WIDTH)
  capL.set(cv2.CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT)
  capR.set(cv2.CAP_PROP_FRAME_WIDTH,  IMAGE_WIDTH)
  capR.set(cv2.CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT)


動作させながら調整

下記のコマンドで実行します。
python stereo.py
「q」か「Ctl-c」でプログラムは止まります。

「image left」に左のカメラ、「Image right」に右のカメラの出力が表示されていることを確認します。
出力が合っていない場合は、コードの「cv.VideoCapture」に渡す番号を変えて、プログラムを再実行してみてください。


角度が悪いと認識が良くないので、左右が平行になるようにダンボールをねじったり折ったりして調整してください。
カメラによってレンズの向きに個体差があるため、平行になるとは限りません。
自分の持っているカメラの場合は、このような角度差だと良い結果を得られました。


調整がうまくいけば、画像処理から深度が算出されます。


ざっくりとした作りのカメラから、ざっくりとした深度が取れました。

以上です。
何かの参考になれば嬉しいです。

参考

Depth Map from Stereo Images
Stereo Vision Tutorial - Part I
2014-11-03 100均Webカメラ2台でステレオマッチングやってみた
Disparity of stereo images with Python and OpenCV
StereoBM in OpenCV 3 (Python) missing module

キャリブレーションを行うと、精度が上がるかもしれません。
How to calibrate a stereo setup (two DVS or DAVIS sensors)

変更履歴

2016/10/13
OpenCVの設定を追加しました。
ソースコードをgist化し、OpenCV2にも対応するようにしました。

0 件のコメント :

コメントを投稿