顔をアニメ画像に変える
今回のテーマ「リアルタイムで顔をジャンヌに変える」です。
これは、前回のリアルタイムで顔にモザイクをかけるの応用編で、モザイクを画像の貼り付けに変えただけのものです。
作りたいもの
前回の顔にモザイクをかける部分を、アニメ画像(ジャンヌ)を貼り付ける関数に変更します。
また、近づいたら画像1(ぐだぐだジャンヌ)で、遠ざけたら画像2(ジャンヌ)に条件分岐させます。
近づくを幅が150px以下にとします。
if (w <= 150):
と、if分岐させます。
応用編_顔に画像を貼り付ける
使う画像


結果

プログラム
import cv2
import numpy as np
#Webカメラから入力
cap = cv2.VideoCapture(0)
#動画書き出し用のオブジェクト
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
fps = 15.0
size = (640, 360)
writer = cv2.VideoWriter('out1.m4v', fmt, fps, size)
'''
カスケードファイルを指定して、検出器を作成
'''
#face5
face_cascade_file5 = "haarcascade_frontalface_default.xml"
face_cascade_5 = cv2.CascadeClassifier(face_cascade_file5)
#anime画像
anime_file = "jeanne.jpg"
anime_face = cv2.imread(anime_file)
anime2_file = "IMG_6138.JPG"
anime2_face = cv2.imread(anime2_file)
'''
アニメ画像を貼り付ける
'''
def anime_face_func(img, rect):
(x1, y1, x2, y2) = rect
w = x2 - x1
h = y2 - y1
if(w < 150):
img_face = cv2.resize(anime_face, (w, h))
else:
img_face = cv2.resize(anime2_face, (w, h))
img2 = img.copy()
img2[y1:y2, x1:x2] = img_face
return img2
'''
動画処理
'''
while True:
#画像を取得
_, img = cap.read()
img = cv2.resize(img, size)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade_5.detectMultiScale(gray, 1.1, 2)
for (x, y, w, h) in faces:
img = anime_face_func(img, (x, y, x+w, y+h))
writer.write(img)
cv2.imshow('img', img)
#ESCかEnterキーが押されたら終了
k = cv2.waitKey(1)
if k == 13:
break
writer.release()
cap.release()
cv2.destroyAllWindows()