MacbookAirのカメラで顔が写ったら顔を笑い男マーク(Python3+OpenCV3+PIL)


シリーズ:
MacbookAirのカメラで顔が写ったらモザイク加工(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔をエッジ抽出(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔をネガポジ変換(Python3+OpenCV3+PIL)
MacbookAirのカメラで顔が写ったら顔を笑い男マーク(Python3+OpenCV3+PIL)

前提

MacbookAirのカメラで顔が写ったらモザイク加工(Python3+OpenCV3+PIL)で作ったFaceクラスを作成しておく。

github のfaces.py

 

笑い男マーク(smileman.jpg)を準備

笑い男マークを検索し、source/image配下にsmileman.jpgを設置しておく。

 

Faceクラスにget_smileman_faceメソッドを実装

Faceクラスに顔が移ったらエッジ化するget_smileman_faceメソッドを実装した。

       def get_smileman_faces(self, image, min_size=(100, 100)):
        """
        顔を笑い男マークにするメソッド。
        image: cv2.imreadで読み取った変数
        min_size: 顔判定する最小サイズの指定。
        """

        # イメージをpillowで扱うことのできる形式に変換しておく。
        img_edit = Image.fromarray(image)

        # 笑い男マーク呼び出し
        img_smileman = Image.open("./image/smileman.jpg")

        # OpenCV用のデータに変換
        img_smileman = np.asarray(img_smileman)

        # pillowではRGB、OpenCVではGBRのため、色の順番を並べ替え。
        img_bgr = cv2.split(img_smileman)
        img_smileman = cv2.merge((img_bgr[2], img_bgr[1], img_bgr[0]))

        # pillow用のデータに変換
        img_smileman = Image.fromarray(img_smileman)

        # 顔認識
        faces = self.get_faces(image, min_size)

        # 顔があった場合。
        if len(faces) > 0:

            # 複数の顔があった場合、1つずつ四角で囲っていく。
            for face in faces:

                # 顔の部分の左上のx,y座標(微調整)
                face_x = face[0] -50
                face_y = face[1]
                # 顔の部分の横の長さと縦の長さ(微調整)
                face_height = face[1]+face[3] - 50

                tmp_smileman = img_smileman.resize((face_height, face_height), Image.LINEAR)

                # 元の画像に加工した顔画像を貼り付ける。
                img_edit.paste(tmp_smileman, tuple((face_x, face_y)))

        #pillow用のデータをOpenCVデータに変換
        img_opencv = np.asarray(img_edit)

        return img_opencv

実行してみる。

if __name__ == '__main__':
    
    face = Face()

    """
    image = cv2.imread("./image/physicists.jpg", 1)
    mosaic_faces = face.get_mosaic_faces(image, min_size=(10, 10))

    # 表示
    cv2.imshow("Show MOSAIC Image", mosaic_faces)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    """

    # カメラからキャプチャー
    cap = cv2.VideoCapture(0)

    while(True):

        # 動画ストリームからフレームを取得
        ret, frame = cap.read()

        # モザイク処理
        # frame = face.get_mosaic_faces(frame, ratio=40)
        # cv2.imshow('MOSAIC FACE', frame)

        # エッジ
        # frame = face.get_edge_faces(frame)
        # cv2.imshow('EDGE FACE', frame)

        # ネガポジ変換
        # frame = face.get_negaposi_faces(frame)
        # cv2.imshow("NEGAPOSI FACE", frame)

        # 笑い男
        frame = face.get_smileman_faces(frame)
        cv2.imshow("SMILEMAN FACE", frame)


        # qを押したら終了。
        k = cv2.waitKey(1)
        if k == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

(opencv_python)$ python faces.py

スクリーンショット 2015-07-11 12.33.56

 

笑い男マーク!
ちなみに攻殻はみたことありません。

 

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です