wear用コーデ画像の顔隠し作業を自動化してみた


皆さん、WEAR(ウェア)ってご存知ですか?
WEARはファッションコーディネートサイトで、弊社サービスの一つです。
要するに各自のファッションコーディネートをシェアし合うSNSです。

そんなWEARの中で、理由はよくわからないですが、顔をアイコンなどで隠して投稿するのが流行っているみたいです。
顔が無い方がコーディネートを客観的に見れるからですかね?

ただ、顔隠す作業って意外にめんどくさく、これ自動化できたらいいな...と思い、アイコン自動配置のプログラムを実装してみました。

ソースコード

import os.path
import datetime
import cv2
import time

# 定数
# dataフォルダ
DATA_PATH = "data"
# resultフォルダ
RESULT_PATH = "result"
# カスケードパス
CASCADE_PATH = "haarcascade_frontalface_default.xml"


def main():
    # カレントディレクトリを取得
    current_path = os.getcwd()
    icon_image_path = os.path.join(current_path, "icon.png")
    icon_image = cv2.imread(cv2.samples.findFile(icon_image_path))

    # dataディレクトリを取得
    data_path = os.path.join(current_path, DATA_PATH)
    # dataディレクトリを取得
    result_path = os.path.join(current_path, RESULT_PATH)
    # ディレクトリ直下のファイル一覧を取得
    data_list = os.listdir(data_path)

    for file in data_list:

        # 処理時間計測タイマースタート
        start = time.time()

        # ファイルの拡張子を取得
        file_name, ext = os.path.splitext(file)

        # 拡張子がpng、jpegの場合
        if ext == u'.png' or ext == u'.jpg' or ext == u'.jpeg':
            # 画像を読み込む
            input_path = os.path.join(data_path, file)
            # 入力画像格納
            image = cv2.imread(cv2.samples.findFile(input_path))

            # グレースケール変換
            image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

            # カスケード分類器の特徴量を取得する
            cascade = cv2.CascadeClassifier(CASCADE_PATH)

            face_rect = cascade.detectMultiScale(image_gray, 1.1, 3, 5)

            if 0 < len(face_rect):

                print("Face discovery")

                for x, y, w, h in face_rect:
                    # 顔を隠す
                    image = put_icon(image, (x, y, x + w, y + h), icon_image)

            else:

                print("Face not found")

            output_path = os.path.join(result_path, create_time_path(file_name, ".png"))
            # 画像を保存
            cv2.imwrite(output_path, image)

            # 処理時間計測タイマーストップ
            t = time.time() - start

            print(output_path, ":", t)


# 時刻込みのユニークのファイルパスを出力する
def create_time_path(file_name, ext):
    # 現在時刻を取得
    time = datetime.datetime.now()
    # パスを作成
    path = file_name + time.strftime("%Y%m%d%H%M%S") + ext

    return path


def put_icon(img, rect, icon_image):
    # アイコンを被せる領域を取得
    x1, y1, x2, y2 = rect
    w = x2 - x1
    h = y2 - y1
    # アイコンを画像に重ねる
    img2 = img.copy()
    icon_image = cv2.resize(icon_image, (w, h), cv2.INTER_AREA)
    img2[y1:y2, x1:x2] = icon_image
    return img2

if __name__ == '__main__':
    main()

実行結果


元画像のコーデはこんな感じ。
(盛れてる写真を使う...)


実行後は見事にアイコンがフィット!!!
面倒だった作業があっという間に!!
アイコン画像が適当なのは気にしないでください...

最後に

顔認証の精度がそんなに良いわけではないので、写真によってはいくつもアイコンがセットされてしまうので、軽く使ってみるくらいが良いかもしれません。