こんにちは!
なおき(@waste_investor)です!
緊急事態宣言も再度発令され、なかなか思うように飲み会等を行うことができない世の中が続いています。
その影響もあり、Twitterで知り合った人とリモート飲み会をする機会が増えました。
リモート飲み会の 集合写真をTwitterに上げると、不特定多数の人が閲覧するので、顔をアイコンに置き換えてツイートしています。
いつも手作業でコピペしてもらうのは大変なので、自動化してみました。
やりたいこと
・TwitterのAPIからアイコン写真を取得
・リモート飲み会スクリーンショットから顔を検出
・顔をアイコンに置き換える
TwitterAPIからアイコンの写真を取得
今回はPythonを使ってTwitterのAPIからアイコンの画像をダウンロードしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import tweepy import urllib.request import urllib.error # Twitter認証コードは別ファイルで管理 import TwitterAPIKey def download_image(url, dst_path): """ URLの画像をダウンロード url:画像ファイルのパス dst_path:画像保存パス """ try: data = urllib.request.urlopen(url).read() with open(dst_path, mode="wb") as f: # アイコン画像を一旦保存 f.write(data) except urllib.error.URLError as e: print('画像取得失敗' + str(e)) def GetTwitterIcon(user_name_list): """ Twitterのアイコン画像を保存する user_name_list:アイコンを保存するユーザー名 """ # TwitterAPIのパスワードを取得(別ファイルで保存) consumer_key =TwitterAPIKey.CONSUMER_KEY consumer_secret =TwitterAPIKey.CONSUMER_SECRET access_token=TwitterAPIKey.ACCESS_TOKEN access_secret =TwitterAPIKey.ACCESS_SECRET # auth認証 auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret) auth.set_access_token(Access_token, Access_secret) api = tweepy.API(auth, wait_on_rate_limit = True) for user_name in user_name_list: img = api.get_user(user_name) url = img.profile_image_url_https # normalサイズから400×400ピクセルを取得できるようにパスを変更 url_400size = url.replace('normal', '400x400') dst_path = './' + user_name + '.png' download_image(url_400size, dst_path) |
GetTwitterIconにTwitterのユーザー名(@waste_investorなど)のリストを入力することでアイコンの画像を保存することができます。
TwitterのAPIで取得できる画像へのURLはnormalサイズのものなので、あとで拡大する際に画像が荒くなってしまいます。そのため、normalの画像から400×400ピクセルの画像へのパスに切り替えます。
Twitterの認証には TwitterDevelopersAccountを作成しておく必要があります(APIを叩くために必要)。
アカウントの作成方法はこちらにまとめているのでご参考に。
-
-
参考【ツイート解析】Twitter Developersアカウントを作成方法
こんにちは! なおき(@waste_investor)です! ツイート分析をするために、Twitter Developersアカウントを作成しました。 作成までの手順をまとめておきます。 ...
続きを見る
写真から顔を検出する
DiscodeやZoomなどでみんなでとった写真から顔の座標を検出します。
顔の検出にはOpenCVのカスケード分類機を使用します。
カスケード分類機は輝度画像のエッジ等から顔の特徴量を算出して、顔と思われる座標を検出してくれます。
正面を向いている顔であればそれなりの精度で顔を検出することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import cv2 def DetectFaces(img_path): """ 画像から顔を検出する img_path:顔を検出する画像のパス """ # カスケード分類機を読み込む face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 画像読み込み img = cv2.imread('img_path') # グレー化 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 顔検出 faces = face_cascade.detectMultiScale(img_gray, 1.3, 5) return faces |
OpenCVを活用するだけなのでソースコードも短く済みます。
この短さで顔を検出できるのには驚きです。
こんな感じで画像中の顔を検出することができます。
haarcascade_frontalface_default.xmlは、OpenCVをインストール後にPythonフォルダの中に入っています。検索してファイルパスを見つけてください。
MacのAnaconda環境ではこの環境下にファイルはありました。
/anaconda3/lib/python3.7/site-packages/cv2/data
Twitterアイコンを保存→顔検出→アイコンに置き換え
アイコンの保存と、顔検出の部品は揃ったので、あとは処理をつなげるだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import cv2 import tweepy import urllib.request import urllib.error # Twitter認証コードは別ファイルで管理 import TwitterAPIKey if __name__ == '__main__': # スクリーンショットの画像へのパス img_path = 'rimote_20210424.jpeg' # アイコンを保存したい人の TwitterユーザーID # 左上→右上→左下→左下の順に格納 user_name_list = ['@konasu_freelife', '@waste_investor', '@okapi_neko', '@naniwaOLnon'] # 画像を保存 GetTwitterIcon(user_name_list) # 顔を検出 faces = DetectFaces(img_path) # 画像を読み込み img = cv2.imread(img_path) # 検出した顔をアイコンに置き換え for i, (x,y,w,h) in enumerate(faces): # 保存済みのTwitterアイコン画像を読み込み icon_img = cv2.imread('./' + user_name_list[i] + '.png') # 画像をリサイズ(検出した顔のサイズにアイコンを合わせる) resize_icon_img = cv2.resize(icon_img, (w, h)) # 置き換え img[y:y+h, x:x+w] = resize_icon_img # 保存 cv2.imwrite('face_to_icon.png', img) |
途中経過では顔が見えてしまうので、公開できないのが残念ですが、これで集合写真中の顔写真をアイコンの画像に置き換えることができました。
楽しいリモート飲み会ありがとう!
割と複雑そうなことをやっていますが、自分で実装した部分はほんのわずかです。
外部ライブラリがとても充実して、基礎さえ押さえればコーディングはとても簡単なので、Pythonはみんなに使えるようになってほしいプログラミング言語です。
時代のトレンドは自動化。
流れに乗り遅れないスキルをつけていきたいものです。