2009年2月6日金曜日

GUIを付けて透明度をいじれるようにした


やっぱりシュパパッとGUIをコードできてこそWPFとの組み合わせにした意味があるよな、と主って、透明度をスライダで設定できるようにしてみた。もちろん、バインディングを使っているので追加したコードは超短い。
xamlに追加したコード:

<StackPanel Grid.Row="0" Orientation="Horizontal">
<Label Padding="5,0,0,0" VerticalAlignment="Bottom">ARオブジェクトの透明度:</Label>
<Label Padding="0,0,5,0" VerticalAlignment="Bottom"
ContentStringFormat="##0%"
Content="{Binding ElementName=OpacitySlider, Path=Value}">
</Label>
<Slider Name="OpacitySlider" VerticalAlignment="Bottom" Width="100"
Minimum="0" Maximum="1.0" TickFrequency="0.01" IsSnapToTickEnabled="True"
Value="1.0" SmallChange="0.01" LargeChange="0.1"/>
</StackPanel>

Visual Brushを作成するコード:

Label label = new Label() {
Content = textureTexts[i],
Foreground = Brushes.OrangeRed,
Padding = new Thickness(0),
};
Viewbox viewBox = new Viewbox();
viewBox.Stretch = Stretch.Uniform;
viewBox.Child = label;
Border border = new Border() {
Background = Brushes.LimeGreen,
Width = 1.0,
Height = 1.0
};
border.SetBinding(Border.OpacityProperty,new Binding("Value"){
Source=OpacitySlider
});
border.Child = viewBox;
VisualBrush labelBrush = new VisualBrush(border);
labelBrush.Viewbox = new Rect(0, 0, 1, 1);
labelBrush.Stretch = Stretch.UniformToFill;

ARToolkit(Plus)+DShowNET+WPFのサンプルを更新


冗長性が高く認識率に優れるらしいBchタイプのマーカに対応した。readme.txtを参照のこと。アーカイブはこちら

上に掲載したのはBchマーカを使った場合の実行画面。ただ、特に検出率が高まった感じはしなかった。画像ではパーフェクトだけど。

追記:ARToolkitPlusのラッパーコード中にこういう記述がある。
Id-based markers directly encode the marker id in the image.
Simple markers use 3-times redundancy to increase robustness,

Id-based markers directly encode the marker id in the image.
while BCH markers use an advanced CRC algorithm to detect and repair marker damages.

ちょっと意味がとり難いが、おそらく、Simpleマーカは冗長化した上で2Dバーコードにエンコードするアプローチなのに対し、Bchは冗長化をしない代わりにCRCチェックサムを埋め込んで成功例が少なくて良いからIDが確実に読み取れたマーカのみを許容するアルゴリズムを使っているということだろう。Simpleが512種類に対してBchが4096種類なのだから、後者の方が冗長化の度合いが高いはずがない。

configファイルを使って見つからなかったマーカの位置を推定する機能をARToolkitPlusは持っていて、たとえば剛体の姿勢測定が用途として想定されているようだが、この場合マーカの冗長性よりも使えるマーカの数を増やした上で少なくて良いからIDが正しく読み取れるマーカを見つける事の方が重要になる。なにしろ四点で剛体の姿勢は決まる!Bchはそういう用途のためのマーカシステムで、IDはどうでも良くてマーカの姿勢の検出精度だけを問題にするのならばSimpleマーカシステムの方が優れているのだろう。

というわけで、単純な遊び用途ならばBchマーカの出番はなさそうだ。剛体の姿勢検出なんて遊びじゃやらないし、第一Configファイルを用意するための準備がかなり大変だ。

ARToolkitPlus+DshowNET+WPFのソースを更新

ここにおいてあるソースを更新した。
更新内容は主にバグ取り。ウィンドウのLoadedイベントでthis.Close()すると例外が投げられるのね。Application.Current.Shutdown()するようにした。これで、キャプチャデバイスを選択しなかった場合に変な終了の仕方をしていたのが、行儀良く終了するようになった。

これでコードは相当に整理された。ARToolkit関連のサンプルコードとしては最も単純化されていてサンプルコード/スケルトンとしての役割を果たし易いと自負している。ただ、コードのコピペが多く変数名のつけ方が自分流のつけ方と整合的でない部分があるので、少しリファクタリングしておきたいところ。構造はもうこれで良いだろう。window1.xaml.csの行数もメソッド数も十分に少ない。

2009年2月5日木曜日

異なる大きさのマーカ、同じIDを持つマーカ


ArManWrap.ARTKPSetPatternWidthメソッドにはマーカの大きさの実測値を指定するのだと思っていたのだが、そうではないようだ。これは、マーカ座標系におけるマーカをあらわす正方形の大きさを指定するメソッドみたいだ。つまり、例えば10.0を指定すると、(-5,-5)-(5,-5)-(5,5)-(-5,5)を頂点とする正方形を作ってから変換行列を取得して適用してやると、ちょうど画面上でマーカと重なるようになる。

そういうわけで、使っていたマーカが一辺3cmなのでこのパラメタに30を指定していたのだが、大きさの違うマーカもそのまま認識してくれた。

また、2Dバーコードを認識するというコンセプト上、同じIDのマーカが複数あっても何の問題もなく認識してくれた。中々守備範囲が広い。

カメラの位置に点光源を置いた


ネタとしては弱くなったが、陰影がつくようになった事が分かりやすいように三角柱を置くようにした。


環境光と組み合わせると少し自然になった。もちろん、実際の光環境と不整合であるが故の気持ち悪さはどうしようもない。が、逆にそれが、バーチャルリアリティーな感じで良い。こういった類は、チープなグラフィックの方が効果が喜んでもらえるものだ。あんまり凄いグラフィックだと、photoshopで合成したみたいに見えちゃうからね。

こうしたちょっとした変更は全部xamlの変更ですんでしまう。WPF恐るべし。

高速化


ARToolkitPlusとWPFの組み合わせのサンプルのコードを少し高速化した。といっても、高速化の余地はほとんどなくて、描画のコールバックの度にキットの初期化とクリーンアップを行っていたのをウィンドウのロード時とクローズ時に行うようにしただけ。でも結構な負荷だったようでかなり動作が改善された。

それにしても今日は、午前中に横になっていたら、午後になって割と調子が良い。眼はすげー霞んでるけど。

体調

最近、朝5時くらいに眼が覚めてそれから9時くらいまでは若干比較的調子が良いのでARで遊んだりできるわけだが、今日は8時までしかもたなかった。なんか感冒様の症状が強まっていて、のどに痰が絡んで息から嫌なにおいがするし、熱はないけど熱っぽいし、眼がしょぼしょぼして霞む。ARの方も一区切りついたし今日はゆっくりしよう。