Discord Bot と 顔認識を組み合わせてみた　～ＬＴ用～

# はじめに
LTで発表する用の資料

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

お品書きは下記の通り

* なぜ、Discord？
* モジュール，ディレクトリ構造など
* Discord Bot

# なぜ、Discord？
**なんとなくです！**

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

でも LINE Bot もなんかなぁ…

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

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

<a href="https://discordpy.readthedocs.io/en/latest/" rel="nofllow noopener" target="_blank">公式(discord.py)様</a>

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

<a href="https://qiita.com/str32/items/39283355e71240113e09" rel="nofllow noopener" target="_blank">Discord bot の作り方</a>は先日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
```

顔学習データは<a href="https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml" rel="nofllow noopener" target="_blank">こちら</a>を使いました。

# Discord Bot
### プログラム

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/4d8b53dc-9f97-f14b-8b02-dc706d91e881.png)

ちゃんと顔を認識してトリミングしてくれる
![trim.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/71f247b6-8072-3a88-cb5e-e90dbd303d35.png)

もちろん複数人でもトリミングできる
![trim2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435504/5aae2455-5778-a237-7a73-ba7e897d61be.png)


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