😶‍🌫️

サカバンバスピス(模型の方)のプリクラを作った

に公開

Intro

ハロー!MAYAです。
1年半ぐらいに作ったSAKABANN_Timeを解説していきます。
環境依存が激しくて今のところラズパイ以外では動いたことがないのですが
動いてる画像がこれしかなかった…しかもズレてる
こんな感じになってます。

Main

全体像がこんな感じです
https://github.com/PGA942/SAKABANN-Time/blob/main/kaohaihu.py

GitHub見れない人向け
kaohaihu.py
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