FaceControllMovie
- 4. プログラム 1/3 (初期設定)
import gab.opencv.*;
import processing.video.*;
import java.awt.*;
Capture video;
OpenCV opencv;
Movie movie;
float mScale;
void setup() {
size(1280,1024); // 画面サイズ
// webCamデバイスを開く
video = new Capture(this, 640/2, 480/2);
video.start(); // webcam スタート
// OpenCVによる顔認識
opencv = new OpenCV(this, 640/2, 480/2); // OpenCV で開く画像サイズの指定
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); // 検出器を正面顔に設定
// 動画ファイル
movie = new Movie(this, “test.mp4");
movie.loop(); // ループ再生開始
}
- 5. プログラム 2/3 (顔の認識と描画)
float ixShift=0.0, iyShift=0.0;
void draw() {
if(mScale>0) {
scale(mScale);
float h=height/mScale; float w=width/mScale; // 画面の縦横サイズのスケール変換 (mScale倍したために違って見える)
float ix0=(movie.width-w)/2; // 中心部を表示するためのオフセット (動画幅-画面幅[縮尺済み])/2
float iy0=(movie.height-h)/2;
opencv.loadImage(video); // OpenCVへの webCam画像の読み込み
Rectangle[] faces = opencv.detect(); // 顔認識(顔の入る長方形領域の情報取得)
if(faces.length>0) { // 認識された場合は No.0(最初のもの)の情報を採用
int ix = video.width - int(faces[0].x+faces[0].width/2); // 顔の中心の座標(左右鏡像反転)
int iy = int(faces[0].y+faces[0].height/2);
ixShift = map((ix-video.width/2), -video.width/2, video.width/2, -ix0,ix0); // 中心からのずれを動画の座標系へ変換
iyShift = map(-(iy-video.height/2), -video.height/2, video.height/2, -iy0,iy0);
}
image(movie,-ix0+ixShift,-iy0+iyShift); // シフトさせて表示
}
}
- 7. プログラム 3/3 (イベント処理)
// webCamの次の画像が用意できた際の動作
void captureEvent(Capture c) {
c.read(); // 画像を読み込む
}
// movie の次の画像が用意できた際の動作
void movieEvent(Movie m) {
m.read(); // 画像を読み込む
mScale=2.0*width/movie.width; // 拡大倍率 2 ∙
画面幅
動画幅
}
void keyPressed()
{
switch( key )
{
case ' ': // reset the shift
ixShift=0;
break;
case ‘q’: // プログラム終了
exit();
break;
default: break;
}
}