まち吉あいみーな(声優の仲良しグループ)の顔を入れ替えて見ました!笑
(個人的に好きなため)
※まち吉あいみーなとは、アイドルマスターミリオンライブで仲の良いMachico、山崎はるか、愛美、高橋未奈美の4人のことを指す。
方法は、
1. opencvのカスケード分類器で顔認証を行う
2. 抽出した顔を当てはめ先の顔と同じサイズにリサイズする。
3. リサイズした顔を当てはめ先に入れ替える
以上が今回の実験の流れです。
では、早速やって見ます!
import cv2
import matplotlib.pyplot as plt
import sys
from PIL import Image
def resize(filename, w, h):
imageName = "mkamn/"+filename+".jpg"
img = Image.open(imageName)
img_resize_lanczos = img.resize((w, h), Image.LANCZOS)
savepath = 'mkamn/'+filename+'_resize'+'.jpg'
img_resize_lanczos.save(savepath)
img_resize = cv2.imread(savepath)
return img_resize
imagePath = 'mkamn3.jpg'
savepath = 'mknmnFaceReplase.jpg'
face_cascade_path = '/usr/local/opt/opencv/share/'\
'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
face_cascade = cv2.CascadeClassifier(face_cascade_path)
img = cv2.imread(imagePath)
# グレースケール化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#顔を検知
faces = face_cascade.detectMultiScale(img_gray)
print (faces)
faceList = []
a = 0
### 今回は顔以外の認識もあったので無理やり取り除きました
for (x,y,w,h) in faces:
if a!=0:
print(x,y)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_color = img[y:y+h, x:x+w]
faceList.append(roi_color)
a+=1
# cv2.imwrite('a'+imageName, faceList[2])
# sys.exit()
### machico→minami, minami→pyon, pyon→aimi, aimi→machicoと入れ替え
# resize
machico = resize("machico", faceList[1].shape[0], faceList[1].shape[1])
minami = resize("minami", faceList[2].shape[0], faceList[2].shape[1])
pyon = resize("pyon", faceList[3].shape[0], faceList[3].shape[1])
aimi = resize("aimi", faceList[0].shape[0], faceList[0].shape[1])
print(machico.shape)
# print (machico[0])
print(faces[1][0])
print (faces[1][1])
# sys.exit()
for i in range(machico.shape[2]):
for y in range(machico.shape[1]):
for x in range(machico.shape[0]):
img[faces[2][1]+y][faces[2][0]+x][i] = machico[y][x][i]
for i in range(minami.shape[2]):
for y in range(minami.shape[1]):
for x in range(minami.shape[0]):
img[faces[3][1]+y][faces[3][0]+x][i] = minami[y][x][i]
for i in range(pyon.shape[2]):
for y in range(pyon.shape[1]):
for x in range(pyon.shape[0]):
img[faces[4][1]+y][faces[4][0]+x][i] = pyon[y][x][i]
for i in range(aimi.shape[2]):
for y in range(aimi.shape[1]):
for x in range(aimi.shape[0]):
img[faces[1][1]+y][faces[1][0]+x][i] = aimi[y][x][i]
cv2.imwrite(savepath, img)
sys.exit()
今回は次の画像のように顔以外の部分も認識してしまったため、
1つ目の認識範囲をif文で無理やり取り除きました。
(下記コード部)
for (x,y,w,h) in faces:
if a!=0:
print(x,y)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_color = img[y:y+h, x:x+w]
faceList.append(roi_color)
a+=1
取り除いた結果
実験結果
ちょうぜつ雑コラの結果です!
今回はpythontとopencvを用いて雑コラを作って見ました。
この様にプログラミングを覚えれば簡単に自分の作りたいものが作れます。
しかも、今はプログラミングが簡単にできる様にopencvの様なパッケージがたくさんあります。また、プログラミングを覚えていくとこの雑コラを綺麗なコラ画像に変身させることもできます。
プログラミングの楽しさが皆さんに少しでも伝わればと思います。
最後まで読んでくださりありがとうございました。