Processing.rbでARアプリを作ってみる

先日Processing.rbをバージョンアップしました。JRubyに加えてProcessingも自動インストールされるようになり、よりお手軽に使えるようになりましたので、機会がありましたらご活用ください。

今日は以前予告したまま放置していた、Processing.rbでARマーカーを認識させる方法を解説してみたいと思います。

Processing.rbでARマーカーを認識させる方法

Processing用のARライブラリであるNyARToolkit for Processingを利用することで、Processing.rbでもARマーカーを簡単に認識させることができます。

以下手順です。

必要なツールの準備

まず、Processing.rbのインストールと、NyARToolkit for Processingのダウンロードを行います。それぞれ以下のリンクから取得できます。

また、AR Toolkitでは、専用のデータを使ってカメラのキャリブレーションとARマーカーの認識を行います。手っ取り早く使えるデータを用意してみましたので、以下のリンクから取得してください。

フォルダに配置する

取得したファイルは以下のようなフォルダ構成で配置します。なお、simple_ar.rbが今回作成するスケッチファイルになります。

f:id:tkitao:20150406092636p:plain

コードを作成する

言語がRubyに変わること以外は、NyARToolkitの使用方法そのままでコードが書けます。特に面倒な処理は行っていないので、ちょっと手抜きですが実際のコードを一気に載せてしまいます。

require 'processing'

Processing.load_library 'video'
Processing.import_package 'processing.video', 'Video'

Processing.load_library 'nyar4psg'
Processing.import_package 'jp.nyatla.nyar4psg', 'NyAR4Psg'

# A simple example of NyARToolkit with Processing.rb
class SimpleAR < Processing::SketchBase
  def setup
    size(640, 480, OPENGL)

    @cam = Video::Capture.new(self, width, height)

    @nya = NyAR4Psg::MultiMarker.new(
      self, width, height, Processing.sketch_path('data/camera.dat'),
      NyAR4Psg::NyAR4PsgConfig::CONFIG_PSG
    )
    @nya.add_ar_marker(Processing.sketch_path('data/inu.pat'), 80)
    @nya.add_ar_marker(Processing.sketch_path('data/neko.pat'), 80)

    @cam.start
  end

  def draw
    return unless @cam.available

    @cam.read
    image(@cam, 0, 0)

    lights
    no_stroke

    @nya.detect(@cam)

    if @nya.is_exist_marker(0)
      @nya.begin_transform(0)
      translate(0, 0, 40)
      fill(0, 255, 255, 192)
      box(80)
      @nya.end_transform
    end

    if @nya.is_exist_marker(1)
      @nya.begin_transform(1)
      translate(0, 0, 40)
      fill(255, 128, 128, 192)
      sphere(40)
      @nya.end_transform
    end
  end
end

Processing.start(SimpleAR.new)

setupでは、WebカメラとNyARToolkitの初期化を順番に行っています。

drawではWebカメラからキャプチャされた画像があった場合のみ、キャプチャ画像の描画と、認識されたマーカーの位置に3Dオブジェクトの描画を行っています。

動かしてみる

作成したコードは、通常のRubyスクリプトと同様に以下のコマンドで動かせます。

ruby simple_ar.rb

実際の動作画面がこちらです。

f:id:tkitao:20150405231359p:plain

終わりに

NyARToolkitのセットアップ方法にさえ引っかからなければ、以外と簡単にARの処理が書けることがわかりました。もっともARの場合、面白いアプリのネタを出せるかが一番難しいところなんですよね…。