ZAPAnet総合情報局 > [Z]ZAPAブロ〜グ2.0 > プログラミングTIPS > 顔にエフェクトをかけてプライバシーを守るWebサービスの作り方

顔にエフェクトをかけてプライバシーを守るWebサービスの作り方

Add to Google
このエントリーをはてなブックマークに追加
2007年03月09日 カテゴリ:プログラミングTIPS
最近、OpenCVを使った顔認識が流行っているようです。
顔認識ができるということは、アレができるわけです。

顔にモザイク!

Web上で写真を公開するときは、プライバシーを守る必要があるため、顔は隠しておいた方が良い場合があります。
そんな時に、「顔にエフェクトをかけるWebサービス」があれば便利です。

例えば、こんな風に…

spiritlooseのはてなダイアリーさんの写真を使わせてもらいました)

というわけで、今回は「顔にエフェクトをかけてプライバシーを守るWebサービスの作り方」をまとめてみます。


1.OpenCVインストール
2.Image::ObjectDetectインストール
3.OpenCV、Image::ObjectDetectのインストールにつまいたとき
4.Imagerを使いこなす
5.顔を塗りつぶすサンプルプログラム
6.顔に特定の画像を貼り付けるサンプルプログラム
7.最後に



1.OpenCVインストール

顔認識をするには、Intelのオープンソース画像処理用ライブラリ「OpenCV」を使うと簡単です。
まずはサーバーにOpenCVをインストールします。

OpenCVに行き、最新バージョンをダウンロードします。
サーバーで解凍した後、解凍したディレクトリに移動し、インストールします。
./configure
make
make install
この後、少しだけ設定をしておかないと、次のライブラリがインストールできなくなってしまいます。

/etc/profileに以下の設定を追加します。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig
/etc/ld.so.conf に以下の設定を追加します。
/usr/local/lib
忘れずにコマンドを打っておきます。
ldconfig

参考リンク


OpenCVのインストール - PukiWiki
黒研HowTo Wiki - Vine3.1へのOpenCVインストール
3つ目のは最初のに戻る
2. OpenCV の インストール


2.Image::ObjectDetectインストール

次に、Webサーバーで動くプログラム言語からOpenCVを扱えるようにします。
spiritlooseのはてなダイアリー - OpenCVを使って画像の物体認識をするPerlモジュール作った」で公開されているImage::ObjectDetectを利用すると、Perlで簡単にOpenCVが扱えるようになります。
Ruby版は、dara日記 - OpenCVで物体認識を行うRuby拡張ライブラリのソースにあります。

Image::ObjectDetectをPerlのCPANでインストールするには、
perl -MCPAN -e shell
cpan> install Image::ObjectDetect
とすればOKのはずですが、Imagerなどのライブラリも必要になるため、必要に応じてImagerなどもインストールしておきます。


3.OpenCV、Image::ObjectDetectのインストールにつまいたとき

上記方法でインストールにつまづいて、libcxcore.soエラーなどが出たときは、下記サイトが参考になります。
うまくパスが設定できていないと、Image::ObjectDetectがインストールできなくてつまづきます。
OpenCV - Shunsuke Yamamoto Wiki
Fedora掲示板


4.Imagerを使いこなす

Image::ObjectDetectが無事インストールできたら、次は顔部分へのエフェクト処理に移ります。
Imagerには、様々な処理機能があります。
下記サイトを参考にしながら、使うエフェクトを決めます。
Imager::Draw - Draw primitives to images - search.cpan.org
Clouder::Blogger: Perl Archives


5.顔を塗りつぶすサンプルプログラム

例えば、顔全体を黒く塗りつぶしたいのであれば、spiritlooseのはてなダイアリー - OpenCVを使って画像の物体認識をするPerlモジュール作ったを参考に、以下のようなプログラムにします。(サンプルとして、ここでは以下のソースを文字コードEUC-JPとして作成しました。環境に応じて変えてください。)
#!/usr/bin/perl
use strict;
use warnings;

use Imager;
use Image::ObjectDetect;

my $file = 'picture.jpg';
my $image = Imager->new->read(file => $file);
my $cascade = '/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml';
my $detector = Image::ObjectDetect->new($cascade);
my @faces = $detector->detect($file);

for my $face (@faces) {
    $image->box(
        xmin   => $face->{x},
        ymin   => $face->{y},
        xmax   => $face->{x} + $face->{width},
        ymax   => $face->{y} + $face->{height},
                color  => 'black',
                filled => 1,
    );
}
$image->write(file => 'output.jpg');

print "Content-type: text/html\n\n";
print "<html lang=\"ja\">\n";
print "<head>\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n";
print "<TITLE>顔を黒く塗りつぶしてみるテスト</TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<p>変換した画像が下に表示されます。</p>\n";
print "<br>\n";
print "<img src=\"output.jpg\">\n";
print "</BODY>\n";
print "</HTML>\n";
実行結果は、このようになります。


簡単に解説しておくと、
$face->{x} が抽出した顔のX座標
$face->{y} が抽出した顔のY座標
$face->{width} が抽出した顔の幅
$face->{height} が抽出した顔の長さ
になっています。
この情報を元にImagerを使って、顔にエフェクトをかけています。


6.顔に特定の画像を貼り付けるサンプルプログラム

また、アキバBlogのように、顔に特定の画像を貼り付けたい場合は、上記ソースの「for my $face (@faces) { ...}」部分を以下のように変えます。
for my $face (@faces) {
    my $file2 = 'picture2.jpg';
    my $image2 = Imager->new->read(file => $file2);
    my $image2 = $image2->scale(xpixels => $face->{width}, ypixels => $face->{height});
    $image->paste(left => $face->{x}, top => $face->{y}, src => $image2);
}
実行結果は、このようになります。



7.最後に

「顔にモザイクをかけるWebサービス」は、上記ソースを改良すれば作れるようになるはずです。
画像URLをパラメータとして動作させたり、ファイルをアップロードしてもらいその場で処理しても大丈夫です。

すでにOpenCVを使ったWebサービスというのはいくつも作られていて、
zoomur.org / 画像を奇麗に拡大!!
Face Detector
などで、すでに活用されています。

今回は顔の塗りつぶしと画像置換の例を作りましたが、顔にモザイクをかけたり、その他のエフェクトをかけたりというのも、OpenCVとImagerを使えば簡単に実現できます。
Imagerだけでも、「それ、Imager で」のような楽しいサービスが作れていますから、応用すればいろいろ楽しいWebサービスが作れそうです。


参考リンク:

dara日記 - OpenCVで物体認識を行うRuby拡張ライブラリのソース
spiritlooseのはてなダイアリー - OpenCVを使って画像の物体認識をするPerlモジュール作った
Jiro Nishiguchi / Image-ObjectDetect - search.cpan.org
404 Blog Not Found:perl - 顔を認識するcgi