少し進んだスケッチのトップに戻る    印刷する

顔とインタラクションする(OpenCV)

カメラがとらえた画像から顔を検知し、その位置や大きさにインタラクティブに応答するProcessingスケッチを作成します。OpenCVは顔の位置や大きさを検知する機能を提供しています。

OpenCV

OpenCVは、オープンソースのComputer vision、画像解析用のライブラリです。 Processing用のライブラリは、次のようにインポートできます。

メニュー[スケッチ] [ライブラリをインポート][ライブラリ-を追加」で、OpenCV for Processingを選択して、インストールします。インストールすると、サンプルのContribute Librariesの中にサンプルが入るので、サンプルを動かして、機能を実験することができます。詳しくは、 OpenCV for Processingを参照。

顔の位置と大きさを使うサンプル

Processingのスケッチで、OpenCVが検知した顔の位置と大きさを知るには次のようにします。 リストA4_1は、顔を検知し、その中心位置に赤い円を描くスケッチです。
顔の上に丸
【リストA4-1】
import gab.opencv.*;        //(1)OpenCVのライブラリ
import processing.video.*;  //(1)カメラ映像
import java.awt.*;          //(1)Rectangleクラス

Capture video;  //(2) Capture オブジェクト用変数の定義
OpenCV opencv;  //(3) OpenCVオブジェクト用変数の定義

void setup() {
  size(640, 480);
  //(4) スピードを考え、表示画面の半分の大きさでキャプチャ
  video = new Capture(this, width/2, height/2); //(4) Capture オブジェクトを生成
  opencv = new OpenCV(this, width/2, height/2); //(5) OpenCVオブジェクトを生成
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
  video.start();
}

void draw() {
  scale(2);                 //カメラ映像のサイズを2倍して、描画
  opencv.loadImage(video);  //openCVにカメラ映像を渡す
  image(video, 0, 0);       //スケッチ画面にカメラ映像を描画
  //openCVは検知した顔をJavaのRectangleオブジェクトの配列として返す
  Rectangle[] faces = opencv.detect();

  for (int i = 0; i < faces.length; i++) {  //検知した顔の数だけ描く
    println(faces[i].x + "," + faces[i].y);
    drawMask(faces[i].x+faces[i].width/2, faces[i].y+faces[i].height/2,
            faces[i].width, faces[i].height);
  }
}
void captureEvent(Capture c) {
  c.read();
}
void drawMask(float x, float y, float w, float h) { //x, yは顔の中心位置
  push();
  translate(x, y);  //顔の中心に座標原点を移動
  noStroke();
  fill(200, 0, 0);
  ellipse(0, 0, w, h);    //顔輪郭の円
  stroke(255);
  strokeWeight(5);
  noFill();
  ellipse(0, 0, 20, 20);  //真ん中の円
  pop();
}

演習問題


顔の上に仮面
【問題A4-1】リストA4_1を参考に、カメラ映像に映る顔の上にオリジナルの仮面を描画してみよう。


【問題A4-2】 ラーニングトレイル[運動と位置の計算]の練習問題6-3ラケットボールゲームでは、マウスカーソルの位置で、画面上のラケット(矩形)を動かしてプレイしました。代わりにカメラがとらえた顔の位置でラケットを動かしてプレイするようにしてみよう。

arigat アットマーク acm.org / copyright © info