サカバンバスピス(模型の方)のプリクラを作った
Intro
ハロー!MAYAです。
1年半ぐらいに作ったSAKABANN_Time
を解説していきます。
環境依存が激しくて今のところラズパイ以外では動いたことがないのですが
動いてる画像がこれしかなかった…しかもズレてる
こんな感じになってます。
Main
全体像がこんな感じです
GitHub見れない人向け
import cv2
import numpy as np
cascade = cv2.CascadeClassifier("/home/serveradmin/Desktop/cascade/data/haarcascades/haarcascade_frontalface_default.xml")
cap = cv2.VideoCapture(0)
img = cv2.imread("/home/serveradmin/Desktop/GAZO/SAKABANN.png")
shot = 0
if not cap.isOpened():
print("CameraDeath")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("ERRoR")
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
hc,wc = frame.shape[:2]
lists=cascade.detectMultiScale(frame_gray,minSize=(150,150))
#img_warped = frame
for (x,y,w,h) in lists:
ht = 279
wt = 795
Sx = abs(round(abs(w)/7.95)/100)#X/Y拡大率
Sy =abs(round(((279/795)*abs(w))/2.79)/100)
dx = x#移動
dy = y+round((abs(h)/3))-round((279/1590)*(abs(w)))
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255), thickness=2)
M = np.array([[Sx ,0 ,dx], [0 ,Sy ,dy]], dtype=float)
frame = cv2.warpAffine(img, M, (wc,hc),frame,borderMode= cv2.BORDER_TRANSPARENT)
cv2.imshow('video image', frame)
cv2.setWindowProperty('video image',cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
まずcascade = cv2.CascadeClassifier("/home/serveradmin/Desktop/cascade/data/)
でカスケード分類器を、
cap = cv2.VideoCapture(0)
で映像入力、
img = cv2.imread("/home/serveradmin/Desktop/GAZO/SAKABANN.png"=280x)
でサカバンバスピスの顔
絶妙な顔
をそれぞれ入れていきます。
そこからカメラ周りのエラー処理が入って、
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
がグレースケールにする関数、そこから少し下のlists=cascade.detectMultiScale(frame_gray,minSize=(150,150))
はカスケードの四角のサイズをリストに代入、
for文に入って22,23
行目で顔のサイズに合わせた拡大率をSx,Sy
へ代入、27,28
行目でバスピス合成、
for文を抜けた直後のsetWindowProperty
で別ウィンドウでの画像表示をやっています。
実は5,22,23,27,28
行目しか書いてません
苦労したところ
理解不足が明らかな原因なんですが、rectangle
のプロパティx,y
をその四角の中心だと勘違いしていて、その状態でSx,Sy
を設定した結果トップの画像みたいになっていました。確か計3時間ぐらいで解決して、あとは特にハプニングもなく順調に
完成しました(そもそも残り7割は先人の知恵なので…)。
Outro
いかがでしたか?カスケード分類器は他にも目だけ、口だけ等で検出可能で、やる気があれば口をぼやかして隠す、といった芸当もできると思います。ただ納期と技術力が限界でした(文化祭の出し物として3日前に作っていました)。
皆さんのリメイク、お待ちしてます!
Discussion