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の行数もメソッド数も十分に少ない。