3D顔データ読み込み

3D morphable faceというものらしいです。画像から3D抽出+変形してます。
有名なんでしょうか、かなり衝撃的なんですが。

ホームページ。
http://www.mpi-inf.mpg.de/~blanz/

論文読んで作ろうと思ったのですが、そもそも顔画像処理をやったことがないので
勝手がよくわかりません。とりあえず、まずは顔画像データを扱うところを作ってます。

■フリーの顔データベース
3D顔データ+テクスチャは結構フリーであるようです。
http://www.face-rec.org/databases/
データはVRMLで格納されているものが多いようです。
VRMLの表示はGLViewというソフトが良さげなんですが、本家のHPのリンクが
切れて落とせないようです。しかし、下のFlow map and viewerにGLViewが入っていました。
http://www.pore-cor.com/virtual_reality.htm

これでデータを確認。実際、プログラムを作るためにはrawデータを扱わないといけないので
VRMLファイル読み込み部分を作ってみる。OpenGLは使わずC++だけで作ります。

■メッシュ読み込み
VRMLのフォーマットはよく分からないが、ファイルを見る限り頂点座標と三角メッシュのIDが
テキストが書かれているだけのようなので、scanfで読み込んで適当に表示してみる。

それっぽい。ちなみに顔データは正面向いているとは限らず、位置合わせや顔領域の切り出しやら正規化やら
まともにやると大変そうなんですが、データベースのものは処理済みのものがほとんどなので助かります。

■テクスチャ読み込み
昔作っていたレンダラを思い出しながら、三角メッシュの頂点のUV座標値を線形補間して
テクスチャ画像をlanczos補間で参照してメッシュ描画。

■円筒座標系に変換
3次元データを円筒座標系に射影することで、3次元データが2次元データとして扱えます。
3D morphable faceは、ほかの人や表情の顔画像とマッチングをとるので、こっちのほうが都合がいいみたいです。
座標変換は適当に重心をとって、重心から外側に向かってレイを飛ばしてぶつかったメッシュの距離とUV座標を取得。


距離画像(円筒座標系)

テクスチャ画像(円筒座標系)

こんな感じで円筒に射影。

■円筒座標系から3Dデータの復元
距離画像とテクスチャ画像から元の3Dデータを復元できるかどうかをVRMLファイルに書き込んでGLViewで確認。

ちゃんとできてるぽいです。メッシュは格子状の頂点をつないで作りました。

結構急いで作ったのですが一日かかりました。まだまだ先は長いです。