Processingで顔認識を使って強制的にアヘ顔になるソフトを作ってみた

 2年前からやっていた動画を108個紹介するというシリーズ、いよいよ最後の108個目ということで自ら久しぶりにマジキチ動画を作ってみました。なかなかよい電波具合になったかと思っています、ペロリ。

アヘ顔ダブルピース

 自動的にアヘ顔になるソフトつくってダブルピースをやってみたら、本当のアヘ顔ダブルピースになるのではないか!?そんな素朴な発想から顔認識して強制的にアヘ顔ダブルピースになるソフトを作ってみました。
 使ったのはProcessingというフリーのプログラム言語とデジカメのみで、(多分)誰でも作れてしまいます。これを使えば気になるあの子も・・・あ、悪用原因ですよ!!知っている人には攻殻機動隊の笑い男って言うとわかりやすいかな。

成果物

 社会人は結論から話せ!とよく言われるので、とりあえず作ったソフトでPV的なものを作ってみました。本当は適当な人形とかを顔認識させて動画つくろうとしたのですが、イマイチ顔認識率がよくなく結局人間の顔が一番だということになり自ら体張ることになりました。

 なかなかいいアヘ顔っぷりでしょ?今回は予め撮った動画でやっていますがもちろんWEBカメラでリアルタイムにアヘ顔になることも可能です。リアルタイムだとより電波度が上がるので是非試してみて下さい。

準備

 もうみんなアヘ顔したくて興奮してるかい?待ちきれないかい?じゃあ早速作り方を解説していきますね。まずは準備から、僕が使っているのがMacなのでMacの説明ですがWindowsとかLinuxでもできるはずです。適当に調べて下さい(投げやり)。

Processingをダウンロード

 「Processingのサイト」に行ってダウンロードってとこクリックして自分のOS用のファイルをダウンロードしてインストールしてね☆なに?英語だからよくわからないだと!?とりあえずDownloadってやつクリックしてからStable Releasesってとこの下にある一番数字の大きいバージョンのファイルをクリックしときゃいいんだよ!!

Open CVをインストール

 顔認識を使うには、Open CVというライブラリをインストールしないといけないみたいなのでインストールします。「OPENCV Processing and Java Library」ってとこでダウンロード、インストールして見て下さい。インストールした後、ProcessingのLibraryってフォルダにOpen CVってフォルダをコピーする必要があるので注意してね。英語でよくわかなんいけど、気合いでGO!

デジカメを準備

 動画をとれるやつならなんでもOK(多分)!Webカメラならリアルタイムにアヘ顔できるのでこちらもオススメ!僕は家に転がってたLogitechの目玉みたいなWebカメラ使ったよ。
 最初はMacでデバイス認識してくれなかったけど、調べたら「macam」というMac OS XでWebカメラ使えるようにしてくれるソフトがあったのでインストールしたらうまくいきました。またしても英語だけど、とりあえず一番数字の大きいバージョンのファイルをクリックしとけばよいよ!

アヘ顔を準備

 好きなアヘ顔を準備してね!個人で楽しむ分には適当にネットから拾ってこればいいんじゃないかな。好きな形式の画像ファイルを落としてね。えっ?フリー素材のアヘ顔が欲しい?仕方ないなぁ、僕が作ったとっておきのをあげるよ。ちゃんと透過PNGになっているからすっけすけだぜ!

120225_Ahegao
 誰も描いてくれなかったので自分で描きました

プログラミング

 じゃあさっそくプログラミングしてみましょう。何?プログラミングがわからない!?やったことない!?ばっきゃろう!俺だってよくわかんねぇよ!いいんだよ、Processingってソフト実行して コピペして ▶ボタンおしたらそれでいいんだよ!祈って 食べて 恋をしてみたいなもんだ!みんなそうやって大きくなったんだよ!

120225_Processing
 実行して コピペして ▶ボタン押しての図

 あ、ただソースコード適当なフォルダに保存して、同じフォルダにアヘ顔の画像ファイルを「ahegao.png」という名前で保存するを忘れないでね。jpeg画像にする場合は、ソースファイルの方をいじってやって下さい。
 コピペするソースコードは下記を参照してね。解説?そんなものねぇよ!勘だよ勘!動きゃいいんだよ!

■Webカメラを使ってアヘ顔になる方法

 WebカメラをPCに接続してから実行して、適当な顔をカメラで写すとリアルタイムでアヘ顔が楽しめるよ!結構角度は重要なので正面を向いて下さい、目、鼻、口的なものがあれば人間じゃなくても認識してくれます。

import hypermedia.video.*;
import java.awt.Rectangle;
import processing.video.*;

boolean rec = false;  // true: recording
int fps = 30;
int w = 640;
int h = 480;

OpenCV opencv;
MovieMaker mm;

PImage img;

void setup() {
size( w, h );

opencv = new OpenCV(this);
opencv.capture( width, height );
opencv.cascade( OpenCV.CASCADE_FRONTALFACE_ALT );

img = loadImage("ahegao.png");
imageMode(CORNER);

 if(rec){
  mm = new MovieMaker(this, w, h, "ahegao.mov", fps, MovieMaker.VIDEO, MovieMaker.LOSSLESS); 
  frameRate(fps);
 }

}

void draw() {
opencv.read();
image( opencv.image(), 0, 0 );
 Rectangle[] faces = opencv.detect( 1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40 );

for( int i=0; i<faces.length; i++){
image(img, faces[i].x, faces[i].y, faces[i].width, faces[i].height );
}
  if(rec){
    mm.addFrame(); 
  }
}


void keyPressed() { 
  if (key == ' ') { 
    if(rec){
       mm.finish(); 
    }
    exit();
  } 
}

ちょっとだけ解説:
1.最初の方の int w = 640; int h = 480; って奴は解像度だよ。使っているカメラの解像度に合わせて数字を変えてやってね。よくわからなければ、そのまま実行してみればよいよ。何事もチャレンジだよ。

2.boolean rec = false; ってやつは、false→trueにするとアヘ顔動画を保存できるよ。スペースキーを押すと終了して「ahegao.mov」ってファイル名で同じフォルダに保存されるよ。動画のフレーム数は int fps = 30; の数字を変えれば変わるよ。まあ動作あまりに重かったら適当に小さくしてやって。

■好きな動画をアヘ顔動画にする方法

 次はあらかじめ撮っておいた動画を顔認識して、自動的にアヘ顔にいてくれるプログラム。同じようにコピペして保存して、アヘ画像を「ahegao.png」、変換したい動画を「source.AVI」ってファイル名にして同じフォルダに保存して実行すれば、あっという間に普通の動画がアヘ顔動画に早変わり。大きい動画だと凄い時間かかるから、rec = true にして別ファイルに時間かけて書き出してから後でアヘ顔動画を鑑賞するのがよいです。AVI以外のファイル(mpgとかmov)の場合は、ソースコードを「source.mpg」とか「source.mov」って変えてやればよいよ!

import hypermedia.video.*;
import java.awt.Rectangle;
import processing.video.*;

boolean rec = true;  // true: recording
int fps = 30;
int w = 1280;
int h = 720;

OpenCV opencv;
MovieMaker mm;

PImage img;

void setup() {

  size( w, h );

  opencv = new OpenCV( this );
  opencv.movie( "source.AVI", width, height );
  opencv.cascade( OpenCV.CASCADE_FRONTALFACE_ALT );

img = loadImage("ahegao.png");
imageMode(CORNER);

 if(rec){
  mm = new MovieMaker(this, w, h, "ahegao.mov", fps, MovieMaker.VIDEO, MovieMaker.LOSSLESS); 
  frameRate(fps);
 }
}

void draw() {

  opencv.read();
  image( opencv.image(), 0, 0 );
  Rectangle[] faces = opencv.detect();

  for( int i=0; i<faces.length; i++){
  image(img, faces[i].x, faces[i].y, faces[i].width, faces[i].height );
  }
  if(rec){
    mm.addFrame(); 
  }
}


void keyPressed() { 
  if (key == ' ') { 
    if(rec){
      mm.finish(); 
    }
  exit();
  }
}

■強いられる動画
 途中で使ったガンダムAGEで話題の強いられる効果です。これは
Processing+OpenCVで顔検出を使ったり強いられたりする方法」という記事のソースコードをコピペしただけです。最低だね!

■画面分割

 ちょっと試しにやってみた最後の方の僕の顔が増えていく気持ち悪い効果です。
int bunkatsu = 60; で分割数が変わります。3なら3×3の分割動画に、1024なら1024×1024の分割動画になります。ただ並べてコピペしているだけなので、分割数多くしても処理速度ほとんどかわらないのがミソです。

import hypermedia.video.*;
import java.awt.Rectangle;
import processing.video.*;

boolean rec = true;  // true: recording

int bunkatsu = 60;

int fps = 30;
int w = 1280;
int h = 720;

OpenCV opencv;
MovieMaker mm;

PImage img;

void setup() {

  size( w, h );

  opencv = new OpenCV( this );
  opencv.movie( "source.mov", w/bunkatsu, h/bunkatsu );

 if(rec){
  mm = new MovieMaker(this, w, h, "bunkatsu.mov", fps, MovieMaker.VIDEO, MovieMaker.LOSSLESS); 
  frameRate(fps);
 }
}

void draw() {

  opencv.read();
  for(int i=0; i<bunkatsu; i++){
    for(int j=0; j<bunkatsu; j++){
      image( opencv.image(), i*w/bunkatsu, j*h/bunkatsu);
    }
  }
  
  if(rec){
    mm.addFrame(); 
  }
}


void keyPressed() { 
  if (key == ' ') { 
    if(rec){
      mm.finish(); 
    } 
  }
  exit();
}

参考にした記事

 参考っていうか、ほとんどこれらのサイトから丸パクリだよ!最低だね。でもみんなこうやって大きくなったんだよ☆先人の知恵に感謝。

http://blog.degoo.org/post/52635972113/processing-and-opencv-hidakatoru
 偉大なる先人


Processing+OpenCVで顔検出を使ったり強いられたりする方法 - むだな ものを つくる
 最初の準備とかはこのサイト見た方が多分わかりやすいです。素晴らしい

Processingによる画像処理プログラミング(pdf)
 教科書みたいなまとめ。と思ったら名古屋市立大学の講義の資料でした。Processingの講義なんて楽しそう「このページ」にProcessing使った画像処理や、動画処理に関するいろんな資料が置いてありました。素晴らしいです。

まとめ

 ProcessingとOpenCV使う事で簡単に思いつきを形にすることができました。Webカメラで顔認識するまで実質30分程度、これほどお手軽にできてしまうのは素晴らしいですね。色々情報やライブラリが充実しているからだと思います。もともとふとした思いつきでやってみたのですが、画質に少し拘ったり、顔認識以外のエフェクトも試してみるうちに「これって普通に動画のFX(特殊効果)に使えるじゃん」って気づきました。
 iMovieとかの動画編集ソフトって一応色々特殊効果あって、フィルム調にしたり多少凝ったムービー作ったりできるのですが、テンプレート以外のことをやろうとしてもほとんど何もできないんですよね。Adobe Effectsとか使えば色々できるのかもしれませんが流石にちょっと10万はポンと出せない。そんな僕くらいの背伸びしたアマチュアにはProcessingってピッタリの動画処理ソフトなのかもって思いました。正直馬鹿にしててすみませんでした。Processingは他にも画像処理や音楽系にも使えそうなのでまた色々実験してみようかなと考えてます。