2009年2月4日水曜日

ARToolkit:複数のマーカ



複数のマーカを検出する場合、conigファイルを作って、使う2次元バーコードのIDを列挙しないといけないみたい。512個を自由に、というわけにはいかないのか・・・。

まあそれほど問題にはならないだろう。

追記:ぐわー、いじってたら動かなくなった。しかも肝心な部分でコード履歴がない。最新のはまだシングルマーカの。やり直しだ。ただ、サンプルからほとんどコピペで上手く行くのは分かったのでもうどうにかなるだろう。

ARToolkitの実験の続き:2DバーコードのIDをテクスチャにした


これで複数マーカー対応にした時に楽しいはずだ。

ちなみにこのテクスチャはLabelオブジェクトを使ってVisualBrushを作る事で超手抜きで実現している。WPFのリッチさが早速発揮されているというわけ。Direct3DやOpenGLで文字をテクスチャにしろと言われたら、技術的な問題は何もないにしても、とても手間がかかるだろう。

ARToolkitの実験ソース置き場を作った

これからはここに置く。現時点でのソースを置いておいた。まじでVisual C# express 2008オンリーでビルドできます。巷のARToolkit関連のサンプルと比べるとビルドにたどり着くまでの敷居は圧倒的に低いでしょう。

マーカも0番から4番までのシートを同梱しました。一辺が3cmくらいになるように印刷すると設定を変えなくてすみます。あるいは、どこだか(c:\documents and settings\ユーザ名\Local Settings\Application Data\ARWithWPFの下のどこか)に作られるuser.configファイルで設定を変えてください。もちろん、開発環境からプロジェクトのプロパティ→設定タブで設定を変えてもかまいません。

それと、とりあえず、3D表示するオブジェクトの大きさが決めうちになっていたのをマーカーの大きさに合わせるようにしたらかなり良くフィットするようになった。カメラのキャリブレーションの必要は私の環境ではとりあえず必要ないようだ。

DirectShowの経験が不足していてグラフやらピンやらさっぱり分からないので人のサンプルコードを丸写し。そのためか終了時にキャプチャを終了させる関数を呼び出したら帰ってこなくなることがある。開発環境から実行しているならデバッグメニューから強制終了してください。

TODO:何もしないとActiveMovie Windowとやらが表示されてキャプチャ結果が映されてうざいので散々苦労して非表示にする(存在はしたまま)事ができたのだが、そもそもグラフとやらの組み方次第では出てこないようにできると思うので調べておこう。

ARToolkitPlusとDShowNETとWPFの組み合わせで動いたー



やっぱりカメラのキャリブレーションファイルの形式がARToolkit本家とARToolkitPlusとで違っていた。でも、ARToolkitPlusについてきたキャリプレーションツールはビルドにてこずっている。ていうか無理。もうプリプロセッサが存在する言語と付き合うのは無理。ヘッダファイルという存在が吐き気がする。

というわけでとりあえずARToolkitPlusに付属の適当なカメラのキャリブレーションファイルを使用してみたらあっさりと上手く行ってしまった。イエイ!正しいキャリブレーションじゃないので少し歪むのはご愛嬌。

面白いのは、本家のARToolkitはパターンファイルをプログラムで読み込んで、それと同じパターンをマーカとして撮影すると認識されるという仕組みなのに対し、ARToolkitでは二次元バーコードを用いる。つまり、プログラム側でパターンを登録する必要なしに、Simpleバージョンのコードなら512種類、BCHバージョンなら4096種類のマーカを自由に使える。プログラム側では認識したマーカのid番号が取得できる。この画像ではウィンドウのタイトルに、4番目のidのマーカが認識されたと表示されているが、0番から4番まで撮影するマーカを取り替えるとちゃんとこのタイトルの表示が変わってちょっとうれしい。

こうなると、当面の目標は複数のマーカを識別して、その上にバーコードに対応する番号を描画するプログラムを作る事だな。

それはそうと、キャリプレーションはどうにかしたいなあ。


改めてポインタを。
ARToolkitPlusの.net用ラッパー:
http://www.brains-n-brawn.com/default.aspx?vDir=wpfaugreal
DShowNET:
http://www.codeproject.com/KB/directx/directshownet.aspx
DShowNETのサンプル:
http://web.sfc.keio.ac.jp/~shokai/archives/2007/01/directshownet-capture-save-image.html

NyARToolkitがいやだったのはそもそもDirectXの経験がない事もあるのだが、DirectX SDKが必要で環境が特異的になってしまう事。一方でARToolkitPlusの.netラッパー+DShowNET+WPFの組み合わせならば、事実上は標準の.net framework環境とbrains-N-brawnによる``ARToolKitPlus - modified to be a DLL and export C-style functions that can be pInvoked from C#''だけで完結する。今のソリューション構成はARToolkitPlusの.netラッパーとDShowNETのプロジェクトをそれぞれ独立させて、それらのビルドターゲットアセンブリを自分のプロジェクトから参照するようにしているが、これは必要ならばひとつのプロジェクトにまとめる事すらできる。

ARToolkitを使う上では、導入しなければいけない物が多すぎて開発のスタートアップ段階で躓きやすいのと、人に配布するとき何をどうすれば良いのかさっぱりわからないというのが問題だと思うのだが、私が今やっているARToolkitPlusの.netラッパー+DShowNET+WPFの組み合わせならば、標準の.net framework環境とbrains-N-brawnによるARToolKitPlusのdllで全て完結する。しかも3DについてはWPFによって容易なコーディングが可能だ。初音ミクがウマウマする動画がニコニコ動画で流行った後、ARToolkitはアカデミックな領域以外ではやはり敷居が高くて一時的なブームに終わった感があるが、この試みをもう少し続けていけば、かなり敷居を下げられると思う。

あれれ?

かなりコードが整理されてきて、もう動かない理由なんか何もないのだが、うーん、サンプルと同じ事をキャプチャした動画に対してやっているだけなのに動かない。

ひょっとしたらカメラのキャリブレーションファイルに、ARToolkitPlusとARToolkitで互換性がないのかもしれないと思ってARToolkitPlusを落としてきたが、ツールのバイナリがなくC++のコードのみ。これでもARToolkitと違って整理されたクラスライブラリになっているので一部では歓迎されたようだが、俺としては、もうC#以外触りたくない。せめてJavaくらいだ、許せるのは。あ、VBのVer.6までは別格ね。

というポリシーを曲げて現在Visual C++ 2008 express editionをインストール中。プリプロセッサ使いまくりのコードだったらやだなあ。ビルド通すのに数日かかったりしないだろうな。

directshow関連

ARToolkitをWPFで動かすサンプルが手に入ってわりとうまく行っているので、PCカメラからのキャプチャの方法をメモ:

http://web.sfc.keio.ac.jp/~shokai/archives/2007/01/directshownet-capture-save-image.html
http://www.codeproject.com/KB/directx/directshownet.aspx
http://www.codeproject.com/KB/directx/directxcapture.aspx