memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Processingのrealsenseライブラリで遊んでみた

Kinectが販売中止になって久しいですが。。。そのときに代替器として話題にあがったのがrealsenseでした。

卒業研究とかで使う人が出るかもな。。。とD415とD435をとりあえず買っておいていました。触ったのは以下だけ。。。1年前ですね。なかなか出番がなくて。

memorandums.hatenablog.com

今年のゼミ生がこれを使ってスポーツ時の姿勢評価をしようと言い出したので一緒に調べてみました。

やりたいことはボーン検出して身体の各部位の3D座標が欲しいのですが。。。どうもOSSはなく、Nuitrackっていうサードパーティーのライブラリ?を使うしかないようです。しかも、これはMacに対応していない。。。と。

とりあえず検索していたら、Processingでrealsenseのライブラリを作った方がいたんですね。。。githubで見つけました。

github.com

しかも、Processing IDEに登録されているようで、標準的なライブラリの追加手順でインストールすることができます。使っている人がたくさんいるんでしょうね。。。

僕も試しにと、サンプルを少し改変して以下のようなアプリ?(までいかないね。。。)を作ってみました。

www.youtube.com

Kinectでもこんなやつ作ったことがあったような気がしますが。。。とりあえずカメラから一番近い点を取得して線を描画しているだけです。でも、人影が映るところが。。。なんか面白いですねぇ。

ほぼ、サンプルまんまですし、もう腰が痛くなって殴り書きしたようなソースですが、もし参考になるような人がいるかもしれませんので晒しますね。よければ使ってください。

とにかくcansikさんに感謝です。あざーっす!(←失礼極まりない😁)

import ch.bildspur.realsense.*;

RealSenseCamera camera = new RealSenseCamera(this);

ArrayList<PVector> list = new ArrayList<PVector>();

void setup()
{
  size(640, 480);
  
  // width, height, fps, depth-stream, color-stream
  camera.start(640, 480, 30, true, false);
  background(0);
  strokeWeight(10);  
}

float hx, hy;

void draw()
{
  background(0);
  
  // read frames
  camera.readFrames();
  
  // create grayscale image form depth buffer
  // min and max depth
  camera.createDepthImage(300, 1000);
  
  // show color image
  image(camera.getDepthImage(), 0, 0);

  int d_min = 3000;
  for (int x = 0; x < 640; x+=5) {
    for (int y = 0; y < 480; y+=5) {
      int d = camera.getDepth(x, y);
      if (d > 0 && d < 800 && d < d_min) {
        hx = x;
        hy = y;
        d_min = d;
      }
    }
  }
  
  if (d_min != 3000) {
    list.add(0, new PVector(hx, hy));
    if (list.size() > 20) {
      list.remove(20);
    }
  }

  int c = 0;
  float xx=0, yy=0;
  for (PVector p : list) {
    stroke(255 - c*255/20.0,255 - c*255/20.0,0);
    if (xx > 0 && yy > 0) line(p.x, p.y, xx, yy);
    xx = p.x;
    yy = p.y;
    c++;
  }
}

void mousePressed() {
  camera.stop();
  System.exit(0);
}

<補足>

あ、そうそう。僕のMacが悪いのかもしれませんが。。。なぜか、Processingで終了したあと、再度、スケッチを動かそうとするとエラーが出ます。USBケーブルを挿し直すか、何度も実行ボタンを押すかしないと。。。ダメです。camera.stop()の処理を見てみましたが、ちゃんと書かれているようでしたが。。。close関係でissueが立っていたので既知の問題のようにも見えました。