写真の人物顔を中心に、正方形に切り抜く

2015年12月9日

先日、ウェブサイトをライブタイル対応する記事を書きました。

ライブタイルに画像を表示するためには、サイズを200KB以下にしたほうがよいようです。
そして、ライブタイル自体が正方形なので、画像も正方形になっていたほうが「意図したとおり」に近い形で表示されやすくなります。

そこで、撮りためた写真をライブタイルに表示するために、サイズを縮小するついでに、人物の顔を中心にもってきて正方形に切り抜くプログラムを python で作成しました。

 

1.pythonで画像を縮小する


もとの写真によるのだとは思いますが、
長い方の辺を 400px 程度にすると おおむね 200KB 以下のファイルサイズになりそうでした。

そこで、以下のように OpenCV を使ってリサイズします。

import cv2

def main():
    file = "/var/www/..../PICTURE01.JPG" ※1
    outputfile = "/var/www/..../thumbnail/PICTURE01.JPG"

    im = cv2.imread(file)
    if ( im == None ):
        logging.warn('Cant open:'+file)
        return

    imr = resize_to(im, 400.0)
    cv2.imwrite(outputfile, imr)

def resize_to(image, towh):
    curh = image.shape[0];
    curw = image.shape[1];

    if ( (curh < towh) and (curw < towh) ):
        return image

    if ( curh < curw ):
        per = towh / curh
    else:
        per = towh / curw

    toh = int(math.floor(curh * per)) ※2
    tow = int(math.floor(curw * per))

    return cv2.resize(image, (tow, toh))


※1:実際のプログラムでは、あるディレクトリ以下のすべての画像ファイルを処理するようにしました

※2:長い方の辺を指定長さ(このサンプルでは400pxです)にする縮小率を、短い方の辺にも適用することで、縦横比を維持して縮小します。

 

2.pythonで画像から顔を認識する


OpenCVで顔認識する方法は、検索するとたくさん見つかりますので、それらを参考にしました。


def find_face(image):
    image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
    cascade = cv2.CascadeClassifier(const.CASCADE_PATH)
    facerect = cascade.detectMultiScale(
        image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

ただし、必ずしも100%正確に認識するわけではなく、そうするためには detectMultiScale の引数を調整しながら最適値をみつける必要があるようです。

この処理によってfacerect に「発見した顔を囲む四角形(x,y,w,h)」の配列が戻されます。

ちなみに、解析元の画像サイズが大きすぎると、解析に時間がかかるようです。
今回は、1.で縮小した画像をもとに、顔認識しましたが、それでも大量の写真を処理すると結構な時間がかかりました。

 

3.顔を中心に、画像を正方形に切り抜く


上記2.で得られた facerect をもとに以下の処理を行います。

  • すべての顔が切り抜き後の正方形内に含まれるようにします
  • 正方形は、今回の例では 400*400 になるようにしました
  • すべての顔が正方形内に収まらない場合は、すべての顔の中心を中心にします
  • 顔が見つからない場合は、画像の中心を起点に400*400 にします

この処理は長くなるのでソースは掲載しません。

..もう少し正直にいいますと、雰囲気うまく動いているふうなのだけ確認して、きちんとテストしていないので(はずかしくて)掲載できません。

* * *

単に画像を縮小して正方形にするだけなら簡単なのですが、
ライブタイルに表示してみると、顔が中心にある画像が表示されたほうが断然楽しいのです。

Microsoft の、ライブタイルサンプルページに顔画像が表示されているのも、
その感覚を踏まえてのことなのかもしれません。

The tile template catalog (Windows Runtime apps) – Windows app development
https://msdn.microsoft.com/en-us/library/hh761491.aspx

 

この記事の著者

イルカシステム(株) イルカシステム株式会社

イルカシステム(株)は、以下のような業務用ウェブシステムのご提案、受託開発、運用を行っております。

1.中小企業さま向けの社内向け業務ウェブシステム(営業支援、顧客管理、受注管理、請求入金管理、在庫管理、経営数値管理など)

2.医療業界向けの業務改善システム

※業務ウェブシステムの開発を効率化するための自社サービス「イルカベーカリー」をご提供しております。
※医療業界向けに、臨床研究の無作為割付自動化のための自社サービス「ムジンワリ」をご提供しております。

お問合せはお気軽に、こちらからどうぞ! → イルカシステム株式会社へ問合せ

著者:イルカシステム株式会社

お問い合わせ




会社概要

<p>イルカシステム(株)</p>
<img src="http://www.iruka-system.co.jp/wp-content/uploads/2017/01/WS000000.png" alt="会社概要 住所" width="243" height="84" class="alignnone size-full wp-image-49" />
<div class="alert alert-warning">
2017/1/1より、住所変更いたしました。
</div>
<p><span class="label label-success">TEL</span> 03-5843-9168</p>

  • 中小企業 41個の記事

    中小企業様にご提案・開発してきた実績をもとに、システム構築について記載した様々な記事一覧です。

  • 社内システム 39個の記事

    様々な社内システムをご提案・開発してきた実績をもとに、システム構築について記載した様々な記事一覧です。

  • わかりやすさ 30個の記事

    情報システムをわかりやすく使いやすいものにするためのノウハウ、気をつけていることの記事一覧です。

  • UI設計 27個の記事

    UI(ユーザーインターフェース)は、システムの使い勝手を左右します。どんな点に気をつけているか、どんな考えでシステム開発しているかの記事一覧です。

  • 顧客管理 26個の記事

    これまで構築した様々なシステムのうち、顧客管理機能をどのような観点でご提案、開発しているかをまとめた記事一覧です。

  • 受注管理 18個の記事

    これまで構築した様々なシステムのうち、受注情報を管理する機能をどのような観点でご提案、開発しているかをまとめた記事一覧です。

  • ビジネス 18個の記事

  • 業務 16個の記事

  • 要件定義 14個の記事

    要件定義とはどのようなシステムを構築するのかを決める作業です。要件定義において注意し、考えていることをまとめた記事一覧です。

  • クラウド 13個の記事

  • 登録画面 13個の記事

  • 編集画面 12個の記事

  • システム会社 12個の記事

  • 情報共有 11個の記事

  • みえる化 11個の記事

    手作業をシステム化して効率化するだけでなく、それらの情報を集約して簡単に見えるようにし、社員が自律的に動ける組織を作ることが「みえる化」です。

  • 一覧画面 11個の記事

  • 業務用ウェブシステム 10個の記事

  • エクセル 9個の記事

  • コミュニケーション 9個の記事

  • セキュリティ 8個の記事