FLARToolKitのサンプルを使って、マーカーを認識させようとすると下記のようになります。
FLARToolKitで解析している画像を表示していますが、マーカーの部分が真っ白け……つまり、青い部分のほとんどは黒色として扱われてしまい、マーカーの形が浮かび上がらない状態になっています。
そこで、Adobe Pixel Bender Toolkit を使ってフィルターを作成します。
実行すると、白黒になるようにフィルターを書きます。
書き終わったら、[File]メニューにある[Export Kernel File for Flash Player]で、Flexで使えるようにします。
続いて組み込み。
Filterである .pbj ファイルをロードして、ShaderFilterを作る。
次に、通常のサンプルだと、ウェブカメラからの入力を「背景描画」と「マーカー解析」に使っているのでこれを別々に分ける……
// 背景描画 this.background = new Bitmap(new BitmapData(this.captureWidth, this.captureHeight, false, 0), PixelSnapping.AUTO, true); this.background.width = this.canvasWidth; this.background.height = this.canvasHeight; this.addChild(this.background);こんな感じになるかなと。
これは、FLARTK_Example_Single_SimpleCube_PV3D.as で言うところの、273行目辺りに追加。その直後に // setup ARToolkit というコメントがくる感じ。
背景描画は、 this.background を使うので、this.capture は、addChildしないようにする。
// キャプチャーしている内容を addChild // this.addChild(this.capture);ここまでできたら、MarkerDetectの処理の直前でFilterをかける……
// Marker detect var detected:Boolean = false; try { // カラーフィルター適応 var _data:BitmapData = this.raster.getBuffer() as BitmapData; _data.applyFilter(_data, _data.rect, ZERO_POINT, this.extShaderFilter); detected = this.detector.detectMarkerLite(this.raster, this._threshold) && this.detector.getConfidence() > 0.000001; } catch (e:Error) {}これでフィルターがかかって、実行すると下記のようになると。
実験的に組み込んだだけなので、Filterを毎回やらなきゃならんのかとか、背景描画用にBitmapクラス作らなきゃならんの?とか微妙なところは多いですが、参考までに。
全体コードはもうちょっと試したら、説明ページ作って公開します。
ちなみに、FLARToolKitでやっていますが、同じことをNyARToolKitでもできますし、ARToolKitでもできる。
今回のは色フィルターだけですが、解析する前に画像処理を掛けてあれこれ処理すれば、変わったマーカーも認識させたりできるかもかも。
白黒のマーカーに飽きた方はチャレンジしてみては如何?