😍

OpenCVの顔検出機能で退屈なZoom会議をもっと楽しく!

2021/12/09に公開

https://qiita.com/advent-calendar/2021/kuso-app

お久しぶりです!今回はクソアプリを作って楽しむアドベントカレンダーに参加したので、ちょっと役に立つクソアプリを作ってみたいと思います!

はじめに

最近の会議、ほとんどZoomですよね?Zoomだとなんかこう、熱気が伝わらないというか、面白くないというか・・・。刺激が足りませんよね?

そこで今回は、毎日の退屈なZoom会議に刺激を与えていきたいと思います!

環境

今回は以下のライブラリを利用してコードを作成します。

  • OpenCV
  • Numpy
  • PIL
  • random
  • copy

作るもの

どんなものだと刺激があるでしょうか・・・?大きな音?まばゆい光?

いいえ違います。正解は、Zoom参加者の顔をランダムに入れ替えて、誰が喋っているかわからなくすることです!

顔をシャッフルすることであなたは会議どころではなくなり、瞬時に代わる顔を見つめる機会になるでしょう!

実装

準備

顔認識にはOpenCVのカスケード器を利用します!

利用する前に、設定ファイルをダウンロードしておく必要があります。

https://opencv.org/releases/

から、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)

最後に関数を呼び出して完成です!
今回は

https://jp.techcrunch.com/2020/04/06/2020-04-03-zoom-waiting-rooms-default/

にある
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