😍
OpenCVの顔検出機能で退屈なZoom会議をもっと楽しく!
お久しぶりです!今回はクソアプリを作って楽しむアドベントカレンダーに参加したので、ちょっと役に立つクソアプリを作ってみたいと思います!
はじめに
最近の会議、ほとんどZoomですよね?Zoomだとなんかこう、熱気が伝わらないというか、面白くないというか・・・。刺激が足りませんよね?
そこで今回は、毎日の退屈なZoom会議に刺激を与えていきたいと思います!
環境
今回は以下のライブラリを利用してコードを作成します。
- OpenCV
- Numpy
- PIL
- random
- copy
作るもの
どんなものだと刺激があるでしょうか・・・?大きな音?まばゆい光?
いいえ違います。正解は、Zoom参加者の顔をランダムに入れ替えて、誰が喋っているかわからなくすることです!
顔をシャッフルすることであなたは会議どころではなくなり、瞬時に代わる顔を見つめる機会になるでしょう!
実装
準備
顔認識にはOpenCVのカスケード器を利用します!
利用する前に、設定ファイルをダウンロードしておく必要があります。
から、Sourceをクリックし、ダウンロードします。
ダウンロード後、opencv-4.5.4/data/haarcascades/haarcascade_frontalface_default.xml
を作業フォルダに展開します。
これで準備完了です!
では実際に作っていきましょう!
実装
まずは各種ライブラリのインポートと、顔検出器の準備を行います。
import cv2
from PIL import ImageGrab ,Image
import numpy as np
import random
import copy
cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
続いて顔をランダムにシャッフルする部分です。
def random_face_opencv():
while True:
image = ImageGrab.grab()
image = cv2.cvtColor(np.array(image),cv2.COLOR_RGB2BGR)
image = cv2.resize(image,(int(image.shape[1]/2),int(image.shape[0]/2)))
gray = cv2.cvtColor(copy.deepcopy(image),cv2.COLOR_BGR2GRAY)
faces = cascade.detectMultiScale(gray)
p_list = []
i_list = []
for (x, y, w, h) in faces:
p_list.append([x, y, w, h])
i_list.append(image[y:y+w,x:x+h])
random.shuffle(p_list)
for p,img in zip(p_list,i_list):
img = cv2.resize(img,(p[2],p[3]))
image[p[1]:p[1]+p[3],p[0]:p[0]+p[2]] = img
cv2.imshow('test',image)
cv2.waitKey(1)
最後に関数を呼び出して完成です!
今回は
にある
Zoom画像を利用しました。
すごい勢いで顔がピコピコ入れ替わってますね!楽しい!!
大事な会議の時に是非してください!多分案件が飛ぶと思います!
おまけ
def trans_face(path):
trans_face = cv2.imread(path)
while True:
image = ImageGrab.grab()
image = cv2.cvtColor(np.array(image),cv2.COLOR_RGB2BGR)
image = cv2.resize(image,(int(image.shape[1]/2),int(image.shape[0]/2)))
gray = cv2.cvtColor(copy.deepcopy(image),cv2.COLOR_BGR2GRAY)
faces = cascade.detectMultiScale(gray)
for (x, y, w, h) in faces:
t = copy.deepcopy(trans_face)
img = cv2.resize(t,(w,h))
image[y:y+h , x:x+w] = img
cv2.imshow('test',image)
cv2.waitKey(1)
trans_face('貼り付けたい画像')
顔エリアに好きな画像を貼り付けられるコードです。YoutubeのMVとかに適応すると、アメリカとかでよく見るようなコラ動画みたいになります・・・。
Discussion