FaceTrakingを行ってみた。
いきなり難しいけど。oscP5(Open Sound Control)を学びたいがゆえに行いました。

田所さんのスライドに詳しくは掲載してあるのですが、コンパイルされたFaceOSCをダウンロード。本当に便利な世の中になったもんだ。

[openFrameworks + ofxFaceTracker] →(OSC)→ [Processing + oscP5]
で送信。

FaceTrakingコード

import oscP5.*;

// FaceOSCからのOSCを解析するFaceクラス
class Face {
  //OscP5のインスタンス
  OscP5 oscP5;
  // 検出された顔の数
  int found;
  // ポーズ
  float poseScale;
  PVector posePosition = new PVector();
  PVector poseOrientation = new PVector();
  // ジェスチャー
  float mouthHeight, mouthWidth;
  float eyeLeft, eyeRight;
  float eyebrowLeft, eyebrowRight;
  float jaw;
  float nostrils;

  //コンストラクター
  Face(int port) {
    //ポートを指定して、OscP5を初期化
    oscP5 = new OscP5(this, port);
  }
  // FaceOSCから送られてきたOSCを解析
  boolean parseOSC(OscMessage m) {
    if (m.checkAddrPattern("/found")) {
      // 顔検出数
      found = m.get(0).intValue();
      return true;
    }
    //ポーズ (スケール、位置、向き)
    else if (m.checkAddrPattern("/pose/scale")) {
      poseScale = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/pose/position")) {
      posePosition.x = m.get(0).floatValue();
      posePosition.y = m.get(1).floatValue();
      return true;
    } else if (m.checkAddrPattern("/pose/orientation")) {
      poseOrientation.x = m.get(0).floatValue();
      poseOrientation.y = m.get(1).floatValue();
      poseOrientation.z = m.get(2).floatValue();
      return true;
    }
    // ジェスチャー (口、目、眉、顎、鼻腔)
    else if (m.checkAddrPattern("/gesture/mouth/width")) {
      mouthWidth = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/gesture/mouth/height")) {
      mouthHeight = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/gesture/eye/left")) {
      eyeLeft = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/gesture/eye/right")) {
      eyeRight = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/gesture/eyebrow/left")) {
      eyebrowLeft = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/gesture/eyebrow/right")) {
      eyebrowRight = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/gesture/jaw")) {
      jaw = m.get(0).floatValue();
      return true;
    } else if (m.checkAddrPattern("/gesture/nostrils")) {
      nostrils = m.get(0).floatValue();
      return true;
    }
    return false;
  }

  // 現在の顔の状態を文字で出力
  String toString() {
    return "found: " + found + "\n"
      + "pose" + "\n"
      + " scale: " + poseScale + "\n"
      + " position: " + posePosition.toString() + "\n"
      + " orientation: " + poseOrientation.toString() + "\n"
      + "gesture" + "\n"
      + " mouth: " + mouthWidth + " " + mouthHeight + "\n"
      + " eye: " + eyeLeft + " " + eyeRight + "\n"
      + " eyebrow: " + eyebrowLeft + " " + eyebrowRight + "\n"
      + " jaw: " + jaw + "\n"
      + " nostrils: " + nostrils + "\n";
  }

  //OSCメッセージが送られてきたら解析へ
  void oscEvent(OscMessage m) {
    parseOSC(m);
  }
};

faceClassコード

//Faceクラスのインスタンス
Face face;

void setup() {
  size(640, 480,P3D);
  frameRate(255);
  //Faceクラスを初期化
  face = new Face(8338);
}

void draw() {
  background(255);  
  stroke(0);
  

<blockquote>
  
  //もし顔が検出されたら
  if (face.found > 0) {
    //解析結果を文字で出力
  pushMatrix();
  translate(face.posePosition.x,face.posePosition.y,0);
  scale(face.poseScale);
  rotateX(-face.poseOrientation.x);
  rotateY(-face.poseOrientation.y);
  rotateZ(face.poseOrientation.z);
  
  stroke(0);
  noFill();
  
  ellipse(0,0,40,50);
  fill(0);
  noStroke();
  
  ellipse(-8,face.eyebrowLeft*-1,10,2);
  ellipse(8,face.eyebrowLeft*-1,10,2);
  
  ellipse(-8,face.eyeLeft*-1,4,4);
  ellipse(8,face.eyeLeft*-1,4,4);

  ellipse(0,14,face.mouthWidth,face.mouthHeight);
  ellipse(-2,face.nostrils,3,1);
  ellipse(2,face.nostrils,3,1);
  popMatrix();
  
  print(face.toString());
}
}

以上で表情の認識ができたわけですが。
Open Sound Controlってなんやねんっと。

OpenSound Controlは様々なプラットフォーム間とのデータ通信を可能にする非常に便利な規格です。Processing, Flash, Max/MSPなどの間での通信が代表的です。

要はネットワークを繋げられるってことでローカル上であれば、ローカルからソフト間通信ができるのかと。
もうちょっと詳しく調べてみます。


スポンサーリンク


Originally posted 2015-12-02 01:45:27.