先日、ウェブサイトをライブタイル対応する記事を書きました。
ライブタイルに画像を表示するためには、サイズを200KB以下にしたほうがよいようです。
そして、ライブタイル自体が正方形なので、画像も正方形になっていたほうが「意図したとおり」に近い形で表示されやすくなります。
そこで、撮りためた写真をライブタイルに表示するために、サイズを縮小するついでに、人物の顔を中心にもってきて正方形に切り抜くプログラムを 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です)にする縮小率を、短い方の辺にも適用することで、縦横比を維持して縮小します。
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.で縮小した画像をもとに、顔認識しましたが、それでも大量の写真を処理すると結構な時間がかかりました。
上記2.で得られた facerect をもとに以下の処理を行います。
この処理は長くなるのでソースは掲載しません。
..もう少し正直にいいますと、雰囲気うまく動いているふうなのだけ確認して、きちんとテストしていないので(はずかしくて)掲載できません。
単に画像を縮小して正方形にするだけなら簡単なのですが、
ライブタイルに表示してみると、顔が中心にある画像が表示されたほうが断然楽しいのです。
Microsoft の、ライブタイルサンプルページに顔画像が表示されているのも、
その感覚を踏まえてのことなのかもしれません。
イルカシステム(株)は、以下のような業務用ウェブシステムのご提案、受託開発、運用を行っております。
中小企業さま向けの社内向け営業支援、顧客管理、経営数値管理システム
経営数値をリアルタイムで見える化し、目標達成度を常に把握することができ、顧客へのフォローもスムースになります
中小企業さま向けの受発注管理、請求入金管理、在庫管理
御社特有の受発注業務、出荷処理をシステム化することで業容拡大への大きなお手伝いとなります
医療業界向けの業務改善システム
※医療業界向けに、臨床研究の無作為割付自動化のための自社サービス「 ムジンワリ 」をご提供しております。
IoTシステムの開発
詳しくは ご提供サービス を参照してください。