7
5

More than 3 years have passed since last update.

Discord Bot と 顔認識を組み合わせてみた ~LT用~

Posted at

はじめに

LTで発表する用の資料

今までやってきた顔認識(OpenCV)をボット化してみた
※ 顔認識記事がまだまとまっていません(;・∀・)

お品書きは下記の通り

  • なぜ、Discord?
  • モジュール,ディレクトリ構造など
  • Discord Bot

なぜ、Discord?

なんとなくです!

今まで、Slack Bot で既に作っちゃったしなぁ

でも LINE Bot もなんかなぁ…

そうだ、 Discord ってボット作れるんじゃね???

てことで Discord Bot について調べた

公式(discord.py)様

なんか楽しそうなので作ってみた☆

Discord bot の作り方は先日UPしました。
(少し雑ですが…)

モジュール,ディレクトリ構造など

モジュール

必要なものは以下の通り
必要なものはインストールしてください!

pip install discord       # discordでいろいろしたいときに使用
pip install opencv-python # OpenCVの機能を使用するときに必要(python上ではcv2で使う)
pip install os            # osに依存している機能を利用できる
pip install requests      # HTTP通信をするときに使用
pip install shutil        # ファイルやファイルの集まりに対する高水準の操作方法

ディレクトリ構造

ディレクトリ構造は以下の通り

-- dis_test
   -- cascade
      -- haarcascade_frontalface_alt.xml
   -- img
   -- dis.py

顔学習データはこちらを使いました。

Discord Bot

プログラム

dis_bot.py
# coding:utf-8

import discord
import time
import requests
import shutil
import cv2
import os

# from scripts.photo_processing import PhotoProcessing

IMG_PATH = "./img/"
IMG_SIZE = (128, 128)

FACE_CASCADE_PATH = "./cascade/haarcascade_frontalface_alt.xml"
FACE_CASCADE = cv2.CascadeClassifier(FACE_CASCADE_PATH)
TOKEN = "TOKEN ID"
client = discord.Client()

now_time = time.time()
times = time.gmtime(now_time)

# bot起動時処理
@client.event
async def on_ready():
    channel = client.get_channel(チャンネルID)
    await channel.send("やぁ!元気かい?")

# message を受け取ったとき
@client.event
async def on_message(message):
    # 送り手がボットの場合、無視
    if message.author.bot:
        return

    if message.content.startswith('trim') and len(message.attachments) != 0:
        channel_id = message.channel.id
        url = message.attachments[0].url
        file_name = url.rsplit("/", 1)[1]

        # 画像保存
        rst = requests.get(url, stream = True)

        open_file = open(IMG_PATH + file_name, "wb")
        shutil.copyfileobj(rst.raw, open_file)
        open_file.close()

        # 画像精査
        img_file = cv2.imread(IMG_PATH + file_name, cv2.IMREAD_COLOR)

        # processing
        gray_file = cv2.cvtColor(img_file, cv2.COLOR_BGR2GRAY)
        front_face_list = FACE_CASCADE.detectMultiScale(gray_file, minSize=(50, 50), minNeighbors=3)

        if len(front_face_list) > 0:
            # trimming
            for (x, y, width, height) in front_face_list:

                trim_file = img_file[y:y+height, x:x+width]
                trim_file = cv2.resize(trim_file, IMG_SIZE)

                cv2.imwrite("{0}trim_{1}".format(IMG_PATH, file_name), trim_file)

                await message.channel.send('', file=discord.File("{0}trim_{1}".format(IMG_PATH, file_name)))
        else:
            await message.channel.send("顔が認証されませんでした。")

        # 画像削除
        os.remove(IMG_PATH + file_name)
        os.remove("{0}trim_{1}".format(IMG_PATH, file_name))

client.run(TOKEN)

出力結果
コマンドライン
trim1.PNG

ちゃんと顔を認識してトリミングしてくれる
trim.PNG

もちろん複数人でもトリミングできる
trim2.PNG

トリミングした画像はアイコンとかに使えそうですね!(使わないけど)
以上、Discord Bot × 顔認識まとめでしたー( ˘ω˘ )

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5