マーカーレスAR技術「PTAM」をDVカメラで動作させてみる

 

PTAMとは

PTAMとはオックスフォード大学のGeorg Kleinらによって研究・開発されたプログラムで、3D空間のマッピングとその空間内に3DCGを合成するものです。

言葉で説明するより見たほうがわかりやすいので以下の動画をどうぞ。

今回はこの動画に掲載されている一部の動作(マッピングと3DサンプルCGの表示)のコードが公開されたようなので試してみることにしました。

 

必要なもの

今回使用した環境

  • WindowsXP Professional SP3
  • Visual C++ 2005 (Microsoft Visual Studio 2005 Academic Edition)

必要なもの

 

作業手順

  1. PTAM(PTAM.zip)を解凍する。
  2. GLEW(glew-1.5.0-win32.zip)を解凍し、以下のデータを指定されたフォルダへ移動。
    bin/glew32.dllをWindows/system32へ。
    lib/glew32.libを{VC Root}/Libへ。
    include/GL/glew.hを{VC Root}/Include/GLへ。
    include/GL/wglew.hを{VC Root}/Include/GLへ。
    {VC Root}とはVisual Studio のVisual Cフォルダです。(VC2005なら「C:\Program Files\Microsoft Visual Studio 8\VC」などです。)
  3. shared-libs.zipを解凍する。
    blas_win32.dllとlapack_win32.dllをWindows/system32へ。
    blas_win32.libとlapack_win32.libを{VC Root}/Libへ。
    headers.tar.gzを解凍する。
    lapackとblasのディレクトリを{VC Root}/Include/へ。(ディレクトリの中に入っているものではなくディレクトリごとです。)
  4. 1394camera645_src.zipを解凍する。
    1394cameraフォルダに入っている「1394camera.sln」を開いてコンパイル。
    生成されたdllファイルをWindows/system32へ。
    生成されたlibファイルを{VC Root}/Libへ。
    1394cameraディレクトリのヘッダーファイル(~.h)はすべて{VC Root}/Includeへ。
  5. pthreads-w32-2-8-0-release.exeを実行。3つのディレクトリがでてくる。
    生成されたディレクトリのPre-built.2/includeに入っているsemaphore.h、sched.h、pthread.hの3つのファイルを、{VC Root}/Includeへ。
    生成されたディレクトリのPre-built.2/libに入っているlibファイルとAファイル(~.a)ファイルをすべて{VC Root}/Libへ
    のこりのdllファイルをすべてWindows/system32へ。
  6. jpeg-6b-4.exeは実行、インストール。
    VisualC++でインストールした場所(C:/Program Files/GnuWin32/includeとC:/Program Files/GnuWin32/lib)にパスを通します。パスの通し方
  7. fltk-2.0.x-r6305.tar.bz2を解凍する。
    fltk-2.0.x-r6305フォルダの中のfltkディレクトリを{VC Root}/Includeへ。(ディレクトリの中に入っているものではなくディレクトリごとです。)
  8. CVSを使ってTooN、libcvd、gvars3をダウンロードします。
    コマンドプロンプトから以下のコマンドを順に打って取得します。
    # cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/toon co -D “Fri Sep 5 15:20:31 BST 2008″ TooN
    # cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/libcvd co -D “Fri Sep 5 15:20:31 BST 2008″ libcvd
    # cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/libcvd co -D “Fri Sep 5 15:20:31 BST 2008″ gvars3
  9. TooNディレクトリを{VC Root}/Includeへ。(ディレクトリの中に入っているものではなくディレクトリごとです。)
  10. libcvd/build/vc2005ディレクトリ中に入っている「libcvd.sln」開いてコンパイル。
    コンパイル後、libcvd/libディレクトリ中にlibファイルが生成されるのでそれを{VC Root}/Libへ。
    libcvd/cvdディレクトリを{VC Root}/Includeへ。(ディレクトリの中に入っているものではなくディレクトリごとです。)
  11. gvars3/build/vc2005ディレクトリ中の「gvars3.sln」を開いてコンパイル。
    gvars3/libフォルダに生成された2つのlibファイルを{VC Root}/Libへ。
    gvars3/gvars3フォルダをまるごと{VC Root}/Includeへ。(ディレクトリの中に入っているものではなくディレクトリごとです。)
 

PTAMコンパイル手順

  1. PTAM/Build/Win32の中のPTAM.sln、PTAM.vcproj、CameraCalibrator.vcproj、VideoSource_Win32_CMU1394.ccをPTAMディレクトリへ。
  2. 先ほどコピーしたPTAMディレクトリ中の「PTAM.sln」を開いてコンパイル。
  3. PTAMディレクトリ中に入っているcalib_pattern.pdfをプリンター等で印刷します。

    「CameraCalibrator.exe」にてキャリブレーションを行います。 やり方は上の動画を見ればわかると思いますが、「GrabFrame」をクリックして先ほど印刷した画像(calib_pattern.pdf)を3枚以上撮影します。動画のようにアングルを変えて撮影すると良いです。
    「Optimize」をクリックするとキャリブレーションが行われます。うまくいけばそのまま「save」をクリックして終了します。これで「camera.cfg」が生成されます。
  4. 「PTAM.exe」を実行。スペースバーを押してカメラをゆっくりとよこにずらすことで平面が生成されます。
    「DrawAR」をクリックすると目玉(開発チームのトレードマークらしいです)が出現し、「ViewMap」をクリックするとでカメラ位置、特徴点位置の3Dマップが表示されます。
 

USBカメラで動作させる

「IEEEカメラ・・・?もってねーよ!」という方にお勧めなのが「USBカメラで動作させる」という方法。工学ナビさんからソースがでています。

工学ナビの中の人の研究と周辺 研究者Xの献身

「中の人ブログ用ファイル置き場」 > 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 を使う.
  • 祈る.
 

DVカメラで動作させてみる

USBカメラで実際に使用したところ私のUSBがあまりに性能が悪いのか、キャリブレーションの動きが悪いです。 (原因は他だと後で分かったのですが。)それにUSBカメラのコードがそこまで長くなく不便なのでDVカメラを使って みることに。

HVR-A1J

HVR-A1J

某所からお借りしたDVカメラ「HVR-A1J」をIEEE1394経由で接続して使用しました。(借りたときは広角レンズを所持している方が望ましいということを知らなかったので今回はこれです。)

さて、動作させようと思ったのですが、「ewclib.h」にて問題がでてきたようで、

vh->bmiHeader.biWidthとvh->bmiHeader.biHeightの値を変更し、SetFormatを実行すると見事に変数hrがエラーを受け取ってエラーコード11に飛んでいたので動作してくれませんでした。

VIDEOINFOHEADERに関する情報を色々と調べたのですがこれといった改善方法を見つけることができず。ここでカメラの画面サイズを変えないと、最終的にPTAMに表示される映像がメチャクチャなものになってしまいます。 というわけで、ここの部分はとりあえず直接手を下すしてみることに。

 

VideoSource_Win32_EWCLIB.ccの方を弄ってみる

VideoSourceにはVideoSource::GetAndFillFrameBWandRGBというカメラから受け取ったデータをimRGB変数に格納する関数があり、この変数が 最終的にPTAMプログラム本体の方で使用されるようなので、こっちを書き換えてみることに。

初期状態はこれです。

とりあえずテストでこのように書き換えました。(この書き方はもろ速度的にどーのこーのですが・・) 。これによりDVカメラの右端部分が切れるものの表示可能となりました。

ptam

というわけで私の環境でもとりあえず動作することが確認できました。

今回の状態ではとにかく動作が遅いのでどーにかこーにか対策していきたいと思います。

 

参考文献

マーカレスAR(PTAM)のソースコードを動かしてみた(WindowsXP VisualC++) | happymeme

Cagylogic: PTAMのコードが公開されたので、試してみた。

Cagylogic: VS2008だとPTAMがうまく動かない

工学ナビの中の人の研究と周辺 あのマーカレスARの研究がついにソース公開!

 

このカテゴリのその他の記事