Opencvで雑ファッションチェック

この記事はいなふ進捗アドベントカレンダーの10日目の記事です.

生活とは基本的に、命をつなぎ活動することであり、また生きながらえるために行う様々な活動である。 人は生き続けるためには、少なくとも、何らかの栄養を取らなければならず、(一般に)身体に何かをまとうことで体温を保つ必要があり、また野の雨や風をしのげる場所で眠りをとることを必要とする。つまり食べること、着ること、住まうことである。日本では、そうした生活の基本を漢字で簡潔に表現しようとする時は「衣食住」(いしょくじゅう)などと表現する

"生活".wikipedia.https://ja.wikipedia.org/wiki/%E7%94%9F%E6%B4%BB より

人間が生きて行く上で体温を保つために「衣服」が必要なことはみなさんご存知の通り.

しかし,体温を保つことができれば身に纏うものはなんでもいいのかと聞かれればそうではない.

現代で動物の皮や葉っぱを直に纏っている人間は彼女なんてできないし,異常者として扱われるかもしれない.

ここで,女性が彼氏にしたい男性を選ぶとき,男性のどこをみるかについて考える.

そう,顔である.

これは事実である.

ここでさらに疑問がうまれてくる.顔が良くない我々は為す術もなく淘汰されてしまうのだろうか.

そうではないであろう.もし,顔が良くない人間が子孫を残すことができず息絶えて行くのなら我々は生まれていない(は?).

では,どんな男性が異性といい感じになっているのだろうか.

私が事前に行った調査(要出典)では,「雰囲気イケメン」と呼ばれる男性も異性といい感じになっている確率が高いことがわかった.

一般的に「雰囲気イケメン」は「髪型」と「服装」によって構成されていると言われている(要出典).

ここでは,「服装」について考えていきたい.

※イケメンに関しても服装がダメだと異性といい感じになれないかもしれない

現代における服装

現代における「服装」はその人の人間性を表していると言っても過言ではないだろう(要出典).

「服装」と一概に言っても様々な種類・色,また着方がある.

自分に合った服を選ぶには,まず店に行き,次に自分に色合い・形が合うもの選ぶ.

そして,試着し本当に自分に合っているか確かめる必要がある.

また,このとき友人などを連れて行き,第三者的視点から意見をもらうことも重要である.

しかし,多忙ないなふ君にとって上記プロセスを踏襲することは難しいかもしれない.

そんなときどうすればいいだろうか.

雑誌やWEARなどでサイズ感や着こなしを確かめることができる.

しかし,それらでモデルとして写っている人は皆顔がいい.

我々が今知りたいのは雰囲気イケメンになれる服装である.

そこで,我々の持てる技術を駆使し,いなふ君に合う服をサジェストしたい.

服が似合うか(ファッションチェック)

OpenCV

服を着たモデルの画像からモデルの顔の位置を認識し,そこにその服を着せたい人間の顔を合成する.

モデルの顔認識にはOpenCVを用いることで容易に行うことができる.

例えば以下の画像はかの有名なレナ画像であるが,OpenCVを用いて顔の範囲を特定し,その範囲内を圧縮することで容易にモザイク画像を作成することができる.

レナ レナ(モザイク加工)

以下のPythonコードを用いて,雑合成を行う.

import cv2

IMAGE_PATH = '/path/to/model_image'
FACE_PATH = '/path/to/face_image'

imageIn = cv2.imread(IMAGE_PATH)


cascade_path = "/path/to/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"

cascade = cv2.CascadeClassifier(cascade_path)

gray = cv2.cvtColor(imageIn, cv2.COLOR_BGR2GRAY)

face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(50, 50))
print('face', face)



if len(face) > 0:
    for rect in face:
        faceIn = cv2.imread(FACE_PATH, -1)
        mask = cv2.cvtColor(faceIn[:,:,3], cv2.COLOR_GRAY2BGR)/255.0
        faceIn = faceIn[:,:,:3]

        # 画像によって顔をぴったり合わせるためには値を変える必要がある
        rect[0] -= min(15, rect[0])
        rect[1] -= min(40, rect[1])
        rect[2] += min(20, imageIn.shape[1]-(rect[0]+rect[2]))
        rect[3] += min(45, imageIn.shape[0]-(rect[1]+rect[3]))

        faceIn = cv2.resize(faceIn, (rect[2], rect[3]))
        mask = cv2.resize(mask, (rect[2], rect[3]))

        imageIn[rect[1]:rect[1]+rect[3], rect[0]:rect[0]+rect[2]] = faceIn[:,:] * mask + imageIn[rect[1]:rect[1]+rect[3], rect[0]:rect[0]+rect[2]] * (1.0 - mask)

cv2.imwrite('out.jpg', imageIn)

使ってみる

まず,雑透過顔画像を用意する.

face

次に,着せたい服を着ているモデルの画像を用意する.

fashion

合成する.

out

雑なのでこういうことがある.

out2

まとめ

自分で合成したほうがはやくね?

店に行って試着しろ

謝辞

ピ先輩におかれましては,今回の記事作成に関して貴重な資料を提供していただきまして,誠に感謝しております.

以上.

Go Top