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

公開日:2015/12/09

この記事は、書かれてから 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

このページの著者

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

  1. 中小企業さま向けの社内向け営業支援、顧客管理、経営数値管理システム

    経営数値をリアルタイムで見える化し、目標達成度を常に把握することができ、顧客へのフォローもスムースになります

  2. 中小企業さま向けの受発注管理、請求入金管理、在庫管理

    御社特有の受発注業務、出荷処理をシステム化することで業容拡大への大きなお手伝いとなります

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

    ※医療業界向けに、臨床研究の無作為割付自動化のための自社サービス「 ムジンワリ 」をご提供しております。

  4. IoTシステムの開発

詳しくは ご提供サービス を参照してください。

お読みいただきありがとうございました

Chrome拡張機能で、ブラウザ最小化ボタンの挙動をカスタマイズする

Windowsスタート画面のウェブショートカットをライブタイル対応する

こちらもおすすめ

システム化の相談はしてみたけれど...

中小企業のシステム導入に心強い補助金

お客様とのつながりを点数化し分析する

お客様との接点を記録することのメリット

顧客管理システムの目的は名簿作成ではない

顧客との接点を増やし売上をあげるシステム

お客様とのやりとりの記録のススメ

遠くのシステム会社が安い金額の提案をしてきたら?

システム会社に社内システムの保守を依頼するには

社内システムはできたあと、利用期間のほうが長い