chicken voiceの作成備忘録(2)〜twitterAPIの申請〜
以下の記事を参考に、twitterAPIの申請を行う。 qiita.com
使用用途の記入が必要
Twitter API使用用途の入力
To acquire twitter data and analyze text data using twitterAPI for learning. I want to make a twitter bot that responds to the text data I get. I also want to analyze the number of likes and RTs in text data.
Twitter API使用用途の詳細入力
Output twitter data to text using tweepy from Python. Then, perform text analysis on the output twutter data.
ツイート、リツイート等するか説明
I want to make a twitter bot that responds to the text data I get. So, My app needs to use Tweet, Retweet, like, follow, or Direct Message functionality.
Twitterデータを外部公開する場合はその方法と公開場所を説明
The analysis results obtained from the text data obtained by twitterAPI will be published on my site.
本記事はここまで、あとは申請待ち。
chicken voiceの作成備忘録(1)〜環境構築〜
twitter自動Botを作成する。名称はchicken voice(仮名)。
以下の作業は ../work_chicken_voice
で行う。
python3系のインストール
$ brew install python3
仮想環境の作成
$ python3 -m venv chickenEnv
仮想環境をアクティベートする。
$ source chickenEnv/bin/activate
Djangoのインストール
$ pip3 install django==3.0.2
Djangoプロジェクトの作成
$ django-admin startproject chickenvoice
データベースのセットアップ
$ python3 manage.py migrate
スーパーユーザの作成
$ python3 manage.py createsuperuser
開発サーバの起動
$ python3 manage.py runserver
gitの設定
リポジトリの作成
$ git init
$ git remote origin add origin https://~~~~~~
.gitignoreの作成
$ vi .gitignore chickenEnv db.sqlite3 __pycache__ vscode
本記事はここまで。
【Firestore】The timestampsInSnapshots setting now defaults to true and you no longer need to explicitly set it. ...の対処法
Firestore の Timestamp の仕様変更による警告
ブラウザのコンソールに以下のエラーがでた
The timestampsInSnapshots setting now defaults to true and you no longer need to explicitly set it. In a future release, the setting will be removed entirely and so it is recommended that you remove it from your firestore.settings() call now.
原因
firebase.jsにて、以下の設定を削除することが推奨されているため
firestore.settings({ timestampsInSnapshots: true });
対応
firebase.jsにて、以下の設定を削除すると、表題の警告はでなくなった。
firestore.settings({ timestampsInSnapshots: true });
参考記事:
Firestoreにデータを保存しようとしたら、Missing or insufficient permissions.がでてきた
Missing or insufficient permissions.
FirebaseのFirestoreを使ったデータ保存をしようとしたらMissing or insufficient permissions.
エラーがでてきた。
原因
どうやら、初期設定のルールのままだと保存(書き込み)ができないらしい。
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
参考記事: www.virment.com
解決方法
コンソール画面から: if false;
を削除してみると保存(書き込み)ができるようになった
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write } } }
HostingとFunctionのfirebase.jsonが異なりFunctionが呼べなくなった時の対処法
Firebase + LINE MessagingAPIを使ってメッセンジャーアプリを作成中、LINEからの受信に対して動いていたFunctionが動かなくなった。
- Hostingのfirebase.json
{ "hosting": { "public": "dist", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], "rewrites": [ { "source": "**", "destination": "/index.html" } ] } }
- Functionのfirebase.json
{ "hosting": { "public": "dist", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], "rewrites": [ { "source": "/webhook", "function": "app" } ] } }
起こった問題
Hostingのfirebase.jsonをデプロイすると、/webhookがトリガとなるFunctionが呼ばれなくなってしまう。
原因
Hostingのfirebase.jsonをデプロイがFunction側のrewritesの箇所が上書きされてしまうため。
対処
firebase.jsonを以下に統一する。rewritesの記述する順番も重要。
{ "hosting": { "public": "dist", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], "rewrites": [ { "source": "/webhook", "function": "app" }, { "source": "**", "destination": "/index.html" } ] } }
vueのプロジェクトをFirebaseにデプロイする
現在、firebaseをベースにしたメッセンジャーアプリ開発を目指しています。
今回は、vueのプロジェクトをFirebaseにデプロイするまでの備忘録記事です。
vue開発環境の準備
- vue-cli のインストール
$ npm install -g @vue/cli
- プロジェクトの作成
$ vue create my-salon
- ローカル環境でサーバが立ち上がることを確認
$ cd my-salon $ npm run serve
Firebase開発環境の準備
- firebase-toolsのインストール
$ npm install -g firebase-tools
- 以下のコマンドを実行後、ブラウザで自分のgoogleアカウントを選択する
$ firebase login ✔ Success! Logged in as 【自分のメールアドレス】@gmail.com ←これがでればok
Firebaseプロジェクトの作成 以下の記事を参考にコンソール画面から、Firebaseプロジェクトを作成する。 qiita.com
Firebaseの設定
$ firebase init
上記コマンドを実行後、以下の手順で進む。
- Hostingを選択
- Use an existing projectを選択
- 先ほど作成したプロジェクト名を選択
- What do you want to use as your public directory?
dist
と回答 - Configure as a single-page app (rewrite all urls to /index.html)?
Yes
と回答 ✔ Firebase initialization complete! とでてきたら完了
Firebaseへデプロイ作業
- ワークフォルダでビルド実行
$ npm run build
- firebaseへデプロイ実行
$ firebase deploy
- デプロイされていることの確認
Python + OpenCV4プログラミングの学習(5)〜色の処理など〜
本記事はOpenCVによる色の処理などを行ったときの備忘録である。
事前準備
以下の記事で仮想環境opencvEnvを構築していることを前提とする。 kawakeee.hatenablog.com
また、任意の画像を用意しておく。今回はLenna.jpgを用意した。
グレイスケール
以下のコードを写経しgrayscale.pyのファイルを作成。
import cv2 try: # どのような画像であってもグレイスケールで読み込む img = cv2.imread('img/Lenna.jpg', cv2.IMREAD_GRAYSCALE) if img is None: print('ファイルを読み込めません') import sys sys.exit() cv2.imwrite('img/grayscale.jpg', img) cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() except: import sys print("Error:", sys.exc_info()[0]) print(sys.exc_info()[1]) import traceback print(traceback.format_tb(sys.exc_info()[2]))
対象画像が白黒画像で生成される。cv2.IMREAD_GRAYSCALE
を用いない方法もあるので以下に添付する。
# 対象画像をグレイスケールに変換 (対象画像, 白黒2値)
dst = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
- cv2.IMREAD_GRAYSCALE:cv2.imreadの引数に指定して画像をグレイスケールで読み込む。
- cv2.cvtColor:対象画像を引数で指定した色調に変更する。
使用例:cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
引数は、順に(対象画像, 色調設定)を表す。上記では対象画像がグレイスケールに変換される。
実行結果
(opencvEnv)$ python grayscale.py
指定フォルダ配下にグレイスケールされた画像が生成されていることを確認。
輝度平滑化
以下のコードを写経しequalize.pyのファイルを作成。
import cv2 try: # OpenCVの輝度平滑化関数はグレイスケール画像が対象のため、グレイスケール化 img = cv2.imread('img/Lenna.jpg', cv2.IMREAD_GRAYSCALE) if img is None: print('ファイルを読み込めません') import sys sys.exit() # 対象画像を輝度平滑化する。(輝度の統一) dst = cv2.equalizeHist(img) cv2.imwrite('img/equalizeHist.jpg', dst) cv2.imshow('img', dst) cv2.waitKey(0) cv2.destroyAllWindows() except: import sys print("Error:", sys.exc_info()[0]) print(sys.exc_info()[1]) import traceback print(traceback.format_tb(sys.exc_info()[2]))
OpenCVの輝度平滑化の関数はグレイスケール画像であることを前提にしているため、画像読み込み時にcv2.IMREAD_GRAYSCALE
を指定する。
- cv2.equalizeHist(...):対象画像を輝度平滑化する
使用例:cv2.equalizeHist(img) 引数は、順に(対象画像)を表す。
実行結果
(opencvEnv)$ python threshold.py
指定フォルダ配下に輝度平滑化された画像が生成されていることを確認。
グレイスケールで生成した画像と比べ輝度が統一されたように感じる。
スレッショルド処理
以下のコードを写経しthreshold.pyのファイルを作成。
import cv2 try: # 輝度に対してスレッショルド処理を行うため、グレイスケール化 img = cv2.imread('img/Lenna.jpg', cv2.IMREAD_GRAYSCALE) if img is None: print('ファイルを読み込めません') import sys sys.exit() # スレッショルド変換 (対象画像, 閾値, 最大値, スレッショルド変換設定) # THRESH_BINARY の場合 # 輝度が閾値より大きい箇所は 最大値(200)に変換 # 輝度が閾値以下の箇所は 0に変換 ret, dst = cv2.threshold(img, 100, 200, cv2.THRESH_BINARY) cv2.imwrite('img/threshold_THRESH_BINARY.jpg', dst) cv2.imshow('dst1', dst) # THRESH_BINARY_INV の場合 # 輝度が閾値より大きい箇所は 0に変換 # 輝度が閾値以下の箇所は 最大値(200)に変換 ret, dst = cv2.threshold(img, 100, 200, cv2.THRESH_BINARY_INV) cv2.imwrite('img/threshold_THRESH_BINARY_INV.jpg', dst) cv2.imshow('dst2', dst) # THRESH_TRUNC の場合 # 輝度が閾値より大きい箇所は 閾値に変換 # 輝度が閾値以下の箇所は 0に変換 ret, dst = cv2.threshold(img, 100, 200, cv2.THRESH_TRUNC) cv2.imwrite('img/threshold_THRESH_TRUNC.jpg', dst) cv2.imshow('dst3', dst) # THRESH_TOZERO の場合 # 輝度が閾値より大きい箇所は 変換しない # 輝度が閾値以下の箇所は 0に変換 ret, dst = cv2.threshold(img, 100, 200, cv2.THRESH_TOZERO) cv2.imwrite('img/threshold_THRESH_TRUNC.jpg', dst) cv2.imshow('dst4', dst) # THRESH_TOZERO_INV の場合 # 輝度が閾値より大きい箇所は 0に変換 # 輝度が閾値以下の箇所は 変換しない ret, dst = cv2.threshold(img, 100, 200, cv2.THRESH_TOZERO_INV) cv2.imwrite('img/threshold_THRESH_TRUNC.jpg', dst) cv2.imshow('dst5', dst) cv2.waitKey(0) cv2.destroyAllWindows() except: import sys print("Error:", sys.exc_info()[0]) print(sys.exc_info()[1]) import traceback print(traceback.format_tb(sys.exc_info()[2]))
- cv2.threshold(...):スレッショルド処理した画像を生成
使用例:cv2.threshold(img, 100, 200, cv2.THRESH_BINARY)
引数は、順に(対象画像,閾値,最大値,スレッショルド処理の種類)を表す。
ここでは以下の5パターンのスレッショルド処理を実行。
スレッショルド処理 | 処理内容 |
---|---|
THRESH_BINARY | 輝度が閾値より大きい箇所は 最大値に変換 輝度が閾値以下の箇所は 0に変換 |
THRESH_BINARY_INV | 輝度が閾値より大きい箇所は 0に変換 輝度が閾値以下の箇所は 最大値に変換 |
THRESH_TRUNC | 輝度が閾値より大きい箇所は 閾値に変換 輝度が閾値以下の箇所は 0に変換 |
THRESH_TOZERO | 輝度が閾値より大きい箇所は 変換しない 輝度が閾値以下の箇所は 0に変換 |
THRESH_TOZERO_INV | 輝度が閾値より大きい箇所は 0に変換 輝度が閾値以下の箇所は 変換しない |
実行結果
(opencvEnv)$ python threshold.py
指定フォルダ配下にスレッショルド処理された画像を確認。
アダプティブスレッショルド処理
以下のコードを写経しadaptive_threshold.pyのファイルを作成。
import cv2 try: img = cv2.imread('img/Lenna.jpg', cv2.IMREAD_GRAYSCALE) if img is None: print('ファイルを読み込めません') import sys sys.exit() print(img) # アダプティブスレッショルド変換 # 周りのピクセルと比べ輝度が大きい箇所は 最大値(200)に変換 # 周りのピクセルと比べ輝度が小さい箇所は 0に変換 dst = cv2.adaptiveThreshold(img, 200, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 7, 8) cv2.imwrite('img/adaptiveThreshold.jpg', dst) cv2.imshow('dst', dst) print(dst[:3]) cv2.waitKey(0) cv2.destroyAllWindows() except: import sys print("Error:", sys.exc_info()[0]) print(sys.exc_info()[1]) import traceback print(traceback.format_tb(sys.exc_info()[2]))
(調査中)ググってみたが概要しかつかめていない...
adaptiveThresholdの処理内容について詳しい方いたらご教授お願いします。
ざっくりだが、周辺のピクセルに比べ輝度が大きい箇所は最大値(この場合200)に変換され、小さい箇所は0に変換されているよう。
実行結果
(opencvEnv)$ python adaptive_threshold.py
指定フォルダ配下にアダプティブスレッショルドされた画像が生成されていることを確認。
カラー画像の各成分を分離
以下のコードを写経しsplit.pyのファイルを作成。
import cv2 try: img = cv2.imread('img/Lenna.jpg') if img is None: print('ファイルを読み込めません') import sys sys.exit() # 対象画像のカラー画像を分離 rgb = cv2.split(img) blue = rgb[0] green = rgb[1] red = rgb[2] cv2.imwrite('img/b.jpg', blue) cv2.imwrite('img/g.jpg', green) cv2.imwrite('img/r.jpg', red) cv2.imshow('blue', blue) cv2.imshow('green', green) cv2.imshow('red', red) cv2.waitKey(0) cv2.destroyAllWindows() except: import sys print("Error:", sys.exc_info()[0]) print(sys.exc_info()[1]) import traceback print(traceback.format_tb(sys.exc_info()[2]))
- cv2.split(...):カラー画像の色成分を分離
使用例:cv2.split(img)
引数の(対象カラー画像)を色成分に分離した結果を返す。
今回、生成されたb.jpg、g.jpg、r.jpgは各色成分の強さを表している。画像が白に近いほど、当該成分の色が強い。逆に、画像が黒に近いほど、当該成分の色が弱い。
実行結果
(opencvEnv)$ python split.py
色成分が分離された画像が生成されていることを確認。
他と比べr.jpgが白っぽい画像であることから、元の画像は全体的に赤成分が強い画像であるとわかる。
まとめ
- cv2.IMREAD_GRAYSCALE:cv2.imreadの引数に指定して画像をグレイスケールで読み込む。
- cv2.cvtColor:対象画像を引数で指定した色調に変更する。
- cv2.equalizeHist(...):対象画像を輝度平滑化する
- cv2.threshold(...):スレッショルド処理した画像を生成
- cv2.split(...):カラー画像の色成分を分離