processingでkinectを使うメモ

kinectを使う際に、processingがOpenNIを扱えるようになったらしいので使ってみた。
下記のエントリを参考に使えるようになりました。
Mac+Kinect+Processingで遊んでみる - karaage. [からあげとポニーテイル]

まだまだサンプルを走らせたりリファレンスを見た程度だが、ひとまずのメモ書き。
・スケルトン(各関節)の座標はSimpleOpenNI#getJointPositionSkeletonで取ってこれる。
 →これはexampleにあるUser.pdeを参考にすると良い。
・ 取得した関節の座標を描画するには、まずSimpleOpenNI#convertRealWorldToProjectiveで座標系を変換すること。
 →変換後は普通にprocessingの描画関数に放り込める。

openframeworksでしかスケルトンを扱えないかと思っていたが、こんなに簡単に扱えるとは驚き。

[追記]
RGB画像を表示するために、下記のエントリを参考にしました。
simple-openni Tutorial

音声ファイルを再生するには

processingで音声ファイルを再生するには、minimライブラリを使えば良いみたい。
下記のブログを参考にさせていただきました。
Processingのminimライブラリで音楽を停止するとき | Morikuma Works

注意点としては、mp3ファイルを再生する際にIDタグ(タイトルやアルバム名など)が入っているとエラーが出てしまうということ。
wavファイルをmp3にタグ無しで変換するのが良さそう。

MusicShieldのコードを少し読んでみる

microSDを1GBにしたら動いたので、コードを見てみる。
やりたいこととしては、
 ・センサの入力値に合わせて再生する曲を選択する
というのがある。
なので、毎ループごとに呼ばれている箇所を探してそこにセンサの値を読む処理を割りこませる必要がある。

調べてみると、player.cppのAvailableProcessorTime()という関数のdo while文が毎回呼ばれていることがわかった。
また、ここでMusicShieldについているスイッチの入力を見るためのCheckKey()という関数を呼んでいる。
CheckKey()では入力に合わせて音量や選曲の処理を行なっているようなので、ここを参考にすれば良いみたい。
読むと、playingStateという変数をPS_NEXT_SONGにすると次の曲へ、PS_PREVIOUS_SONGにすると前の曲が再生されるようになっている。

今日はひとまずここまで。
センサを読むところを加えて、playingStateの状態を変更してやればあとは勝手にやってくれそうだ。
しかし、任意の曲番号を指定して再生するのはどうする・・・?

[追記]
なんだかまだ全然良くわかってないけど、PlayCurentFile()という関数の最後に曲を流し終わった時の処理を書くとうまくいけそうなことがわかった。
サンプルコードのままだと
 ・1曲再生し終わった時、SDカード内の次の曲を再生する。
という処理になっているが、
 ・1曲再生し終わった時に一時停止し、次に再生する曲はSDカード内の3番目の曲にする。
という処理にしたい場合は下記のように書くと良い。

/* player.cpp */
void PlayCurrentFile()
{
    char c, nFragments;

    /* 中略 */

    SendZerosToVS10xx();

    // After finishing normally default to requesting to play next song        
    //playingState = PS_NEXT_SONG; //サンプルコードだとここがアクティブになっているのでコメントアウト

    // ここに曲を流し終わったときの処理をどうするか書く!
    playingState = PS_NORMAL; // 単曲再生(次の曲へ進まない)
    playStop = 0;                       // 一時停止する(1にするとループ再生)
    currentFile = 3;                   // 次に再生する曲の番号
}

AvailableProcessorTime()でやればいいのか、PlayCurentFile()でやればいいのかわからないが、ひとまず
 ・playingState = PS_NORMALで固定
 ・playStopを0にしたら停止、1にしたら再生しっぱなし
 ・currentFileを再生したいファイル番号にする
というように適宜変更してやれば良さそう。

Macのfinderでも直接パスを入力したい

Windowsに慣れてしまっているので、どうにもfinderには慣れない・・・。
特にエクスプローラみたいにパスを直接入力出来ないのがもどかしい(出来るかもしれないけど・・・無知)。

下記のソフトをインストールすることで解決した。
FinderPath

「Command+G」でウィンドウ上部にアドレスバーが出てきて入力出来る。
Tabで補完もしてくれて捗る!

Mac OS X Lionで動作しました。

Arduino+Music Shieldを使う(準備編)

Arduinoから音声を再生したかったので、下記のシールドを購入した。
Seeed Studio INT109B2P Music Shield

インストール方法は下記に書いてある。
Music Shield - Wiki

ひとまずwikiの手順に従いMusic v1 14.zipとNewSoftSerial.zipをダウンロード。
で、..\arduino-0022\librariesに置くらしいが・・・どこやねん。
macだとよくわからなかった。調べてみたら、
/Applications/Arduino.app/Contents/Resources/Java/libraries
でいいみたいだ。
ディレクトリをコピーするとArduinoIDE上でSketch→Import Library...にmusicとNewSoftSerialが追加される。
あとportpins.hの書き換えも必要なので、
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/include/avr
にあるportpins.hを上書きする。
コンソール開いてmvやらcpやらで書き換えました。

で、サンプルスケッチを走らせたものの・・・コンパイルは通ったのに再生されない!
よく見たらmicroSDはSDHC(4GB以上)をサポートしてないのね・・・。

ひとまずAmazonで手頃な1GBのをポチってみた。
到着しだい試してみる予定。ちゃんと動くといいけど・・・。

[追記]
1GBのmicroSDで動いた!やはりmicroSDHCは非対応。

processingとNyARToolkitでCGにテクスチャを貼る

NyARToolkitでARマーカに画像を重畳したい。
なのでARマーカに合わせてCGで正方形を描画し、任意の画像をテクスチャとして貼ってみる。

下記のコードで動いた。

import processing.video.*;
import jp.nyatla.nyar4psg.*;

Capture cam;
MultiMarker nya;

// image setting
PImage t_image; // texture image
int t_image_l = 160; // marker and texture size

// display setting
int DISPLAY_W = 640; // display width
int DISPLAY_H = 480; // display height

void setup() {
  size(DISPLAY_W, DISPLAY_H, P3D);
  
  // Setup for NyARToolkit.
  colorMode(RGB, 100);
  println(MultiMarker.VERSION);
  cam=new Capture(this, DISPLAY_W, DISPLAY_H);
  nya=new MultiMarker(this, width, height, "camera_para.dat", NyAR4PsgConfig.CONFIG_PSG);
  nya.addARMarker("patt.hiro", t_image_l);
  
  // Setup texture
  t_image = loadImage("hoge.jpg");
  
}

void draw()
{
  if (cam.available() !=true) {
      return;
  }
  cam.read();
  nya.detect(cam);
  background(0);
  nya.drawBackground(cam);//frustumを考慮した背景描画  
  
  if((!nya.isExistMarker(0))){
    return;
  }
  nya.beginTransform(0);

  beginShape();
  texture(t_image);
  vertex(t_image_l/2*(-1), t_image_l/2*(-1), 0, t_image_l);
  vertex(t_image_l/2, t_image_l/2*(-1), t_image_l, t_image_l);
  vertex(t_image_l/2, t_image_l/2, t_image_l, 0);
  vertex(t_image_l/2*(-1), t_image_l/2, 0, 0);  
  endShape();
  
  nya.endTransform();
  
}

vertexで指定している、4つの引数が謎。
1番目はx座標、2番目がy座標であることはわかるが、3番目と4番目はなんだろう・・・?
テクスチャの幅・高さだろうか。

実行例

元画像

実行結果

テクスチャの画像を切り替えることで、アニメーションのように見せることも出来る。

processingでOpenGLとカメラ(Capture)を使おうとしても実行されない場合の対処法

NyARToolkitの「withOpenGL」というサンプルコードを実行しようとしたが出来ない。

まさに下記の状況が起きた。
processingで描画モードをOPENGLにして,Captureとか使うときの注意 - いつきの技的日記

processingで,
size(width, height, OPENGL);
こんな感じに描画モードをOPENGLにして,そこでvideoとか使いたくて,
Capture video;
video = new Capture(this, width, height);
と,した時に,環境によって動かない時があるっぽい.

どうなるかというと,実行は出来てウィンドウは出るんだけど,そこで何も表示されないままフリーズ.
エラーや警告文は無し.stopボタン押せば消えるけど.

自分の開発環境は
・Max OS X Lion
・Processing 1.5.1(1.2.1でも発生)

対処法

size()直下にレンダラの動作条件を設定するhint()メソッドを書く.

size(width, height, OPENGL);
hint(ENABLE_OPENGL_4X_SMOOTH);

ひとまずこれで動いた。
OpenGLを使うよ!」ってことを明確に設定出来るのかなー。