以前遊んだPTAM。遠い記憶の彼方だったのだが、fkmcさんからBlogにコメントをもらった事をきっかけに、ひさびさに、「Georg Klein Home Page」を見てみると、細かい修正がいろいろあったみたい。なんで、ちょいと最新のコードをコンパイルしてみる。
ほとんど自分に対するメモ。
前回コードを持ってきたのが2008年10月8日ごろ。CHANGELOG.txtを見てみるとあれからいくつかの修正があったみたい。再び、happymemeさんの「マーカレスAR(PTAM)のソースコードを動かしてみた」を参考にちまちま。
改めて見てみると、happymemeさんはVisual C++ 9.0 Express Editionを使っている模様。う~ん。そういえば、俺は、VS2005だとまともな速度が出たんだけど、VS2008だととっても遅かったんだよなぁ。
あれからいろんなライブラリがアップデートされているので、ついでにアップデート。
TooNは前回はCVS経由でとってきていたので、何も考えずに最新版を取り直したら、コンパイルが通りませんでした。ので、TooN: Tom’s Object-oriented numerics libraryにあったやつを拝借。
libCVDとGvars3はCVSで最新版を拝借。
USBカメラを使うためのEWCLIBは1.6がでていた。
Lapack and BLAS、pthreads (pthreads-w32-2-8-0-release.exe)、libjpeg for win32 (jpeg-6b-4.exe)、CMU 1394 camera driver (1394camera645_src.zip)はそのままのを使う。工学ナビさんのUSBカメラ用パッチも変化なし。
あとはほいほいコンパイル。意地でもVisual Studio2008でまともな速度を出してやる。
まず、最初にひっかかったのが、qedit.h関連。最近のDirectXSDKには、dxtrans.hが入っていないのでエラーになる。
MSDN Forumsにdxtrans.h missing in Microsoft DirectX SDK (November 2008)…という議論があって、Morris MaynarさんのMar 27 2008 16:31:48の発言がよさげなので採用。ewclib.hの#include <qedit.h>の直前に
#pragma include_alias( "dxtrans.h", "qedit.h" )
#define __IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__
を挿入。
また、ewclibはmax,minを使っているんだけど、これもどっかいっちゃってるので、
#include <minmax.h>
も追加。
引き続き、EWCLIB関連。1.6からは、EWC_OPEN()の引数が変わったので、それにともないを変更。
// EWC_Open(MEDIASUBTYPE_RGB24, CAPTURE_SIZE_X, CAPTURE_SIZE_Y, FPS);
EWC_Open(CAPTURE_SIZE_X, CAPTURE_SIZE_Y, FPS);
なぜか、EWC_GetBufferSize()で0が返って来ちゃうので、m_bufferの確保のところを
// m_buffer = new unsigned char[EWC_GetBufferSize(0)];
m_buffer = new unsigned char[CAPTURE_SIZE_X * CAPTURE_SIZE_Y * 4];
いや、これ、*3なのか*4なのか今までは、EWC_Openで指定してたんだけど、それがなくなっちゃったんで、自分のカメラで試してみて、*4が返ってきていたので、それで。。。
同様に、GetAndFillFrameBWandRGB()でも、EWC_GetBufferSize()が0のときにEWC_GetImage()を呼んじゃうと、こけちゃうので、
if( EWC_GetBufferSize(1) == 0) return;
を追加。あ、この引数の1は僕はキャプチャデバイスを複数持っているんで、USBカメラの1を指定してます。同様に、EWC_GetImage()の引数も1。
今までのコードが3バイト並びを想定しているが、今は4バイトがとれているので、
pImage++;
を二重ループの頭に追加。
今日、初めて知ったけど、BWイメージは、Gだけ使ってるのね。これって、ちゃんとやったら精度あがるのかな。ってことで
imBW[y][x] = ( 2 * imRGB[y][x].red + 4 * imRGB[y][x].green + imRGB[y][x].blue ) / 7;
で、できあがり。
が、相変わらず、Visual Studio 2008でコンパイルすると遅い。なんでぇ?
たまたまお師匠さんのところでJPEG IPP vs GDI+てな記事を昨日読んでたんで、もしや?と思い、コンパイルオプションを確認。
だ~~~~。ReleaseビルドでもぜーんぶOFFって。。。
どうも、Visual C++ 2005からプロジェクトを変換したときにいったん全部はずされちゃうのね。
ちょ~~むかついたので、全部ON。ちょっと強引にON。
ちうか、たぶん、関係無いのも混ざってるかと。。。
ようやく、まともな速度になりました。
ソースコードアップデートしたけど、そんなに精度かわってない気が。。。。。。
おまけ
あとになって、工学ナビさんの該当記事の中のコメントで見つけたんですが、MixiにPTAMというコミュがあるようでして、そこの雑談トピックでは、10月の時点でVisual Studio 2008でなんで遅いのかの解決に至っていた模様。
うちのサイトがヒントになっているなら、教えてくれよぉ。(笑)
で、そのコミュの動作環境報告トピックで、PatchFinder.ccに
#define CVD_HAVE_XMMINTRIN 0
なる宣言ができるとのこと。こいつは、SSE3のアセンブラのコードを使うとか。
う~ん。
あんまり変わった気がしないけどな。
fkmcです。また来ました。
メニューバーが表示しない件ですが、必要なファイル(GLEWやTooN等)を調べ直し、
再ダウンロードしたり、ファイルのパスの確認をしていたらいつの間にか表示できるようになりました
(具体的にどこが悪かったのかは曖昧になりましたが)
それで、PTAM.exeも実行して表示できるようになったのですが、また、問題が…
表示できたあとメニューのSpacebarをクリックし、
カメラをゆっくりずらしても格子状の平面?が表示されず、
横に伸びた線が消えていくだけになってしまいます。
いろいろ調べていくうちにグラフィックボードも関係しているみたいなので
グラフィックボードも悪いのかもしれませんが、はっきりしません。
画面にでかでかと操作方法が表示されております。(README.txtに書かれているのに何度も聞かれたんでしょうねぇ)
Point camera at planar scene and press spacebar to start tracking for initial map.
でスペースバーを押して、カメラをゆっくりずらすと、
Translate the camera slowly sideways, and press spacebar again to perform stereo init.
ですから、もう一度スペースを押しましょう。
README.txtにも詳しく使い方や必要な環境が書かれています。
#ってことは、
This release is aimed at experienced software developers and/or
researchers familiar with implementing real-time vision algorithms in
C++ on the platform of their choice.
#ってのも読んでないんだろうな。動かすことよりも、コードを読む事の方が楽しいのに。
アドバイスありがとうございます。
READMEは英語ですのでつい避けていました。すみません。
画像に表示されている文章ですが、見本では黄色い文字で表示されているのに私のだと黒い文字になっていて見づらくなっています。言い訳になりますが、そういうことでちゃんと見てませんでした。
>黒い文字になって見づらくなっています。
もしかして、使っているビデオカードがOpenGL1.5に対応していないのかも。
もしそうならば、PTAMは正しく動きませんよ。
READMEではnVidiaでしか試していないと書かれていましたし。(僕のところもnVidiaです。)
やっぱりそうなんですか。私のPCのビデオカードはIntel G33/G31 Express Chipset Familyですが、気になってGLveiwをインストールして確認したら、
案の定、1.4でした…orz
バージョンを変えるにはやはりビデオカード自体を変えるしかないでしょうか?
GLviewは、システムのOpenGLのサポート状況をチェックするツールです。
で、G33はOpenGL1.5を、G31はOpenGL1.4をサポートしているようです。1.4と表示されているということは、G31なんでしょうね。
http://www.intel.com/products/desktop/chipsets/g31/g31-overview.htm
G31ならばどうにもこうにも。。。ビデオカードを交換ですな。
Mixiのコミュに、OpenGL1.5をサポートしてない場合のソースコードのいじり方が書かれています。
http://mixi.jp/view_bbs.pl?id=35619847&comm_id=3720485
僕は試したことがないので、よくわかりません。
>G33はOpenGL1.5を、G31はOpenGL1.4をサポートしているようです。
これは知らなかったです。教えていただきありがとうございます。
>G33はOpenGL1.5を、G31はOpenGL1.4をサポートしているようです。
あ、ちょっと自信がなくなってきました。
http://www.intel.com/Products/Desktop/Chipsets/G33/G33-overview.htm
には、OpenGL1.5の記述がありますが、
http://www.intel.com/Assets/PDF/prodbrief/317311.pdf
では、OpenGL1.4の記述になっています。
Webページが間違ってるのかな。
ぐぐってみると、情報が混在してますね。
http://www.intel.com/support/chipsets/sb/cs-028169.htm
だと、1.5って書いてる
PTAM
概要 マーカー不要のAR技術(ライブラリ群?)らしい Parallel Tracking and Mapping for Small AR Works…