PTAMとはオックスフォード大学のGeorg Kleinらによって研究・開発されたプログラムで、3D空間のマッピングとその空間内に3DCGを合成するものです。
言葉で説明するより見たほうがわかりやすいので以下の動画をどうぞ。
今回はこの動画に掲載されている一部の動作(マッピングと3DサンプルCGの表示)のコードが公開されたようなので試してみることにしました。
今回使用した環境
必要なもの
「IEEEカメラ・・・?もってねーよ!」という方にお勧めなのが「USBカメラで動作させる」という方法。工学ナビさんからソースがでています。
「中の人ブログ用ファイル置き場」 > PTAM for Webcam > PTAM_webcam.zip
EWCLIBも必要です。
●使い方
- EWCLIB (http://www.geocities.jp/in_subaru/ewclib/index.html) のページから
EWCLIB ver.1.2 をダウンロード.ewclib.h をソースフォルダに入れる.- PTAMにもともと同梱されている VideoSource.h の代わりに
このフォルダに同梱されている VideoSource.h を使う.- PTAMにもともと同梱されている VideoSource_Win32_CMU1394.cc の代わりに
このフォルダに同梱されている VideoSource_Win32_EWCLIB.cc を使う.- 祈る.
USBカメラで実際に使用したところ私のUSBがあまりに性能が悪いのか、キャリブレーションの動きが悪いです。 (原因は他だと後で分かったのですが。)それにUSBカメラのコードがそこまで長くなく不便なのでDVカメラを使って みることに。
某所からお借りしたDVカメラ「HVR-A1J」をIEEE1394経由で接続して使用しました。(借りたときは広角レンズを所持している方が望ましいということを知らなかったので今回はこれです。)
さて、動作させようと思ったのですが、「ewclib.h」にて問題がでてきたようで、
vh->bmiHeader.biWidthとvh->bmiHeader.biHeightの値を変更し、SetFormatを実行すると見事に変数hrがエラーを受け取ってエラーコード11に飛んでいたので動作してくれませんでした。
VIDEOINFOHEADERに関する情報を色々と調べたのですがこれといった改善方法を見つけることができず。ここでカメラの画面サイズを変えないと、最終的にPTAMに表示される映像がメチャクチャなものになってしまいます。 というわけで、ここの部分はとりあえず直接手を下すしてみることに。
VideoSourceにはVideoSource::GetAndFillFrameBWandRGBというカメラから受け取ったデータをimRGB変数に格納する関数があり、この変数が 最終的にPTAMプログラム本体の方で使用されるようなので、こっちを書き換えてみることに。