実践!照度差ステレオ<実画像編>
前回のシミュレーション編に続き、現実の物体に対して照度差ステレオを適用します。
撮影システム
自動で撮影できるシステムを組みました。
撮影から処理までの流れは全てpythonで管理されています。一部の処理にはコマンドラインツールを利用していますがsubprocessで呼び出しています。
光源
光源は白色チップLED(白亜化学工業 NSSW157T)を使いました。光量を確保するためLEDを3個並べて1つの光源としました。
LEDの点灯はマイコン(mbed LPC1114)を用いて制御しています。マイコンとPCはシリアル通信で通信でき、PC側から送信する信号によって最大8個までのLEDの点灯を制御できるようにしました。
Woodhamの照度差ステレオでは平行光源を仮定しています。そのためチップLEDを被写体に対して十分に離れた距離に配置することで平行光源として近似できるようにしました。また光源の強さを同じにするために、被写体とLEDの距離が等しくなるように配置しました。
カメラ
カメラはCanon EOS 6D、レンズはEF40mm F2.8 STMを使いました。gphoto2を使ってPC側からカメラのシャッターを制御できるようにしました。
カメラは平行投影に近づけるために望遠レンズを使って撮影することが望ましいですが、手元にあるレンズのうちで焦点距離が1番長いレンズが40mmしかなかったのでこれを使いました。
RAWデータの処理
一般的なカメラは、入射光強度をカメラ応答関数で非線型な変換をして画素値に対応させています。照度差ステレオでは入射光強度を扱っているため、入射光強度と画素値は線形な関係である必要があります。そこでRAW画像で撮影して、線形になるように現像しました。現像にはdcrawを使いました。オプションを"-4 -T"にすると線形で現像されたTIFF形式のデータを出力してくれます。
光源方向の推定
光源方向の推定のための鏡面反射成分を持つ球としてボール球を使いました。完全な球ではないのですが安価に手に入ったのでこれを使いました。(追記(2018/12/25):最近、鏡面球を手に入れました。これからはそちらを使うつもりです。)
実験
3つの光源で撮影された3枚の画像から照度差ステレオを実行しました。 撮影対象は3Dプリンターで印刷した物体(ABS樹脂)と石です。
結果
実験結果です。左の図が撮影対象、中の図が法線マップ、右の図が反射率マップです。