2014-06-16 (月)
*[Android] スマホのカメラを使った3D形状取得(仮)
昨日の続き.
画像から物体の3D形状を推定するために,多くの場合,複数の視点から見た画像を入力として処理しますが,カメラが2つ以上必要か,もしくはカメラを移動して2回画像を取得しないといけないのがネック(?)です.
他の方法として,フォーカス機構のあるカメラならカメラを動かさなくても,フォーカスを変えながら撮った画像を使えば,奥行きの情報が得られそうなので試してみました.
AndroidのカメラAPIにはマニュアルフォーカスが無いので,FOCUS_MODE_INFINITYにした状態からFOCUS_MODE_AUTOにした時にプレビュー画像を連続で処理することで無理やりどうにかします.
適当に作ったアプリで写真を撮ると,
こんな感じで奥行き情報が取得できます(赤くなるほど手前にある.0の箇所は上手く取れてない気がする.上3行と左2列くらいも,バッファ初期化忘れててゴミが入ってます).複雑なことは全くしていなくて,ブロックの情報量が最大になる時間を表示しているだけです.このままだとノイズも多いし解像度も低くて使い物にならないけど,画像の輪郭情報などを使って補完したり,ブロックを適当な窓関数で扱うとかすればかなりマシになりそうです.
端末のカメラの特性に大きく依存するのと,AndroidのCamera APIから現在のフォーカスの状態とか取得出来ないので,時間から推測するしかなくて結構つらい.
さらに,FOCUS_MODE_INFINITYからFOCUS_MODE_AUTOにしてフォーカス合わせしたときのレンズの動きが1方向では無いので,経験則で変なパラメータをいじらないといけない.
理想は,1枚写真撮るだけでテクスチャ貼った状態の3Dモデルをグリグリ動かせるアプリ作りたい.(誰か作ってくれないかなあ)
あとは背景と対象物を分離したいときのヒント情報としてはこれくらいでも使えそうか.
すぐ出来そうだなと思いつつ,実際3~4時間試しただけなのだけど,手をつけるのに時間かかるのどうにかしたい.
あんま実用的ではないけど,ネタとしては面白い気がするので,同人誌の記事として書くか...