はじめに
LTで発表する用の資料
今までやってきた顔認識(OpenCV)をボット化してみた
※ 顔認識記事がまだまとまっていません(;・∀・)
お品書きは下記の通り
- なぜ、Discord?
- モジュール,ディレクトリ構造など
- Discord Bot
なぜ、Discord?
なんとなくです!
今まで、Slack Bot で既に作っちゃったしなぁ
でも LINE Bot もなんかなぁ…
そうだ、 Discord ってボット作れるんじゃね???
てことで Discord Bot について調べた
なんか楽しそうなので作ってみた☆
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)
トリミングした画像はアイコンとかに使えそうですね!(使わないけど)
以上、Discord Bot × 顔認識まとめでしたー( ˘ω˘ )