LoginSignup
10
2

More than 3 years have passed since last update.

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

Posted at

皆さん、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()

実行結果

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

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

最後に

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

10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2