cam-mouse
カメラマウス仮想設計
2012/01~
スタート地点でカメラをリフトアップし、フル迷路を見渡すことを考える。
LONG号の小峰さんは過去にVGAのCCDカメラで8x8の範囲を解読するマウスを作られた。
今は、Mega pixel クラスのCMOSセンサーが手に入る。2M画素クラスのカメラを使えばフル迷路を解析できる可能性がある。
実画像によるあたり実験
- 大会会場で撮影した迷路の写真を元に、gimpで射影変換を行ってみた。

オリジナル画像は水平2200画素
最も条件の悪い、迷路最遠区画の奥行き方向は13画素程度である。
- gimpで射影変換して迷路を真上から見た状態に変換してみる。

正方形からずれているのはレンズの歪曲収差と思われる。
人の目で見るとはっきりと壁の弁別が出来るが、画像処理で赤色を抽出して弁別可能だろうか?
- 上の画像にgimpのフィルタ(色要素・赤→しきい値)をかけて2値化した。

赤の色差画像にすることで壁の白黒を排除し、壁の上面だけを抽出できた。
うまく画像処理出来れば壁の判別が出来そうな感触である。
検討要素
- カメラ
解像度は?レンズ画角は?カメラ高さは?2Mpixelくらいで全迷路解読可能か?- シミュレーションで画素数・カメラ高さ・画角のあたりをつけ、実写で確認
- 入手可能なカメラの探索
- USB Webcam ? Logitech C905m (2Mpix)など、AF、AE、zoom
USB UVCの扱いが問題 FTDI vinculum II なら可能か? - ai-tendo カメラモジュール(OV9655)SXGA(1280x1024)
画素数不足か? - Aptina CMOS chip MT9P401 5Mpix 2.2um 2592x1944 対角7.1mm DataSheet有り
コントローラを作る必要がある。 - レンズは?
http://www.aitendo.co.jp/product/1453
f=3.6mm f=6mm 有効像円不明(たぶん 1/3" 6mm)
- USB Webcam ? Logitech C905m (2Mpix)など、AF、AE、zoom
- 画像処理
撮影した画像を射影変換し、17x17の壁位置にフィッティング、壁有無の判別- カメラ位置/姿勢から射影変換マトリクスを作る
- 画像(R-Y)を加工。射影変換、平滑化、ノイズ除去、2値化
- 射影変換パラメータを変換後画像が正方格子上に乗るようにfit
ロバストなfit手法?
カメラ高さ必要量:最遠点の分解能
- カメラリフトアップ/収納機構
- 収納時サイズが小さく(前後/幅100mm程度以下?)軽く
- 伸長時高さ(300mm程度?)←→ 安定性
- 迷路キャプチャ後最短走行制御
- 走行用壁センサー
収納位置にあるカメラで可能か?
別センサー(フォトセンサー)を設けるか?
- 走行用壁センサー
検討要素は多く、山は高いがまずは机上で出来る画像処理の検討を始めてみよう。
カメラシミュレーション(準備)
カメラで迷路を撮影した画像を作り、その画像を射影変換して迷路を復元する一連の座標変換の定式化を行う。
カメラモデル
下図のように座標をとる。

- x,y,z 座標のx,y平面に迷路を置く。迷路上面を z=0 とする。
- 迷路のスタート地点(座標 xc,yc,zc)にカメラを置く。
- カメラは仰角Φ、方位角θの方向に向け、画角αの範囲を撮像する。
- カメラ座標 u,v,w の視線方向を w 軸とし、u,v 平面に迷路を見下ろした像を射影する。
仰角Φは z軸に平行に下を見る方向を基準とし、x,y平面に平行な方向に向けて回転する方向を正の角度とする。
方位角θはx軸方向を基準とし、上から見て反時計回りを正とする。
図1 迷路座標とカメラ座標の関係
カメラで撮影した画像を求める座標変換
x,y,z 座標に置いた迷路をカメラ座標 u,v,w に変換する。

・・・式1
x,y,z 座標をカメラ位置 xc,yc,zc に平行移動し Φ、θ の回転行列を掛けて u,v,w 座標に変換する。
カメラ座標に変換した迷路画像を u,v 平面に射影する。
u'=u/w
v'=v/w
カメラで撮影された画像が u',v' である。u',v' の撮像範囲は w で正規化されており、水平画角をαとすると、u' の範囲は ±tan(α/2) となる。

Φ=75°,θ=45°,α=40°,zc=250mm
の撮影画像シミュレーション
図2 カメラ画像シミュレーション、ベクタ画像
カメラ画像から迷路画像を復元する
カメラで撮影された u',v' 画像は大きく歪んでおり、これを射影変換により元の x,y 座標上の正方画像に復元する。

・・・式2
・・・式3
カメラ画像を求める変換行列の逆行列を用いて逆変換を行う。この変換行列は直交行列なので、逆行列は行列の転置になる。逆変換の後、x',y'平面に射影する。x',y'は正規化されており、カメラ高さzcを掛けて元のサイズに戻し、さらにカメラのx,y位置(xc,yc)の平行移動を行う。
x"=-zc*x'/z'+xc
y"=-zc*y'/z'+yc

上のカメラ画像から復元した迷路画像
黒線はカメラの視野範囲
画角40°ではスタート地点近傍の壁が視野外であり、カメラ高さなどを変えて複数回撮影する必要がある。
より広い画角にすると、最遠点の壁を分解するのが難しくなる。
図3 カメラ画像から復元した迷路画像
カメラシミュレーション(画像シミュレーション)
実カメラの画素数を想定した画像シミュレーションを行い、カメラ高さや必要な画素数を見積もる。
センサーとレンズの想定
想定センサー
Aptina CMOS MT9P401 5Mpix 2.2um 2592x1944 対角7.1mm
想定レンズ
http://www.aitendo.co.jp/product/1453 f=6mm 有効像円6mm(たぶん)

想定センサー/レンズで水平画角40°、水平2000画素程度の画像が得られる
図4 センサーとレンズ撮像範囲の想定
想定カメラでの撮影シミュレーション画像作成
x,y平面上に迷路パターンを置き、式1によってu',v'平面に射影変換し、2000x1500画素のビットマップ画像を作成した。迷路上面の赤いラインのみの画像である。赤いラインの形状を矩形ではなく、半値幅が12mmのコサイン2乗応答としてエリアシングを軽減した。

Φ=75°,θ=45°,α=40°,zc=250mm
の撮影画像シミュレーション
最も遠方の1区画の奥行き方向が10画素程度で撮像される。
壁上面の幅は1画素に満たない。実センサーでは赤画素のピッチは2倍になるのでさらに厳しくなる。
レンズの解像度は高くないと思われるので、ボケにより赤いラインの応答が広がり、エリアシングが軽減されるのは期待できるが、赤色の振幅は小さくなって弁別が難しくなる。
図5 撮像シミュレーションビットマップ画像
シミュレーション画像から迷路の復元
図5のビットマップ画像を2値化し、射影変換を行って、迷路画像を復元した。
計算の手順は以下の様になる。
- x,y迷路平面をラスタースキャンし、x,y座標を式1を用いてu',v'カメラ座標に変換する。
- 図5の画像から 1.で求めたu',v'の位置の画素値を取り出し、x,yの位置の画素値とする。
結果として逆変換されたx,y画像が得られる。

この理想状態のシミュレーション結果ではカメラから最遠点でも充分壁の判別が可能と思われる。
実カメラではレンズ解像度のなさやセンサーの赤色画素の少なさ、壁の白黒、センサーノイズなどの悪条件が重なるので簡単ではない。
まずは想定したセンサーで、カメラ高さ250mm(壁面から)を出発点にしよう。
図6 復元画像