便利ツールに文字数カウンターを追加しました。文字数を調べたいテキストを入力または貼付けするとリアルタイムで反映されるようになっています。
2020年3月20日19:51
カテゴリ: 便利ツールの紹介
タグ: 便利ツール,
RaspberryPiなどのセキュリティカメラ用途として、OpenCVとPythonでカメラ撮影した画像を、定期的に指定の時刻に自動で動画にして、Googleドライブに自動でアップロードする方法をいろいろと調べてみたのですが、PythonのScheduleというモジュールを使うと簡単にできることがわかったので、実装しました。
Scheduleモジュールの使い方ですが、下のように特定の関数を10分ごとや1時間ごとに実行したり、特定の曜日や時間に実行することができます。↓ schedule.run_pendingは1回の呼び出しで1回のジョブしか実行されないので、何回も繰り返しで実行したいときは無限ループ内で呼び出す必要があります。
import schedule | |
import time | |
def job(): | |
print("I'm working...") | |
schedule.every(10).minutes.do(job) | |
schedule.every().hour.do(job) | |
schedule.every().day.at("10:30").do(job) | |
schedule.every().monday.do(job) | |
schedule.every().wednesday.at("13:15").do(job) | |
schedule.every().minute.at(":17").do(job) | |
while True: | |
schedule.run_pending() | |
time.sleep(1) |
引数を渡して実行するときは下のようにします。↓
def greet(name): | |
print('Hello', name) | |
schedule.every(2).seconds.do(greet, name='Alice') | |
schedule.every(4).seconds.do(greet, name='Bob') |
GoogleドライブへのアップロードはGoogle Drive APIを使用します。Google Drive APIを使用するにはGoogle Developer Consoleから認証情報を取得する必要があります。Google Drive APIをPythonで使うにはPyDriveというモジュールをインストールします。「Google Drive API 有効化」や「Google Drive API Python」などの単語で検索すると参考になるサイトがたくさんあります。Googleドライブへのアップロード用には下の関数を作成しました。↓ アップロード先のフォルダのフォルダIDは環境変数から取得するようにしました。
def upload_to_google_drive(video_file): | |
""" | |
googleドライブに動画ファイルをアップロードする | |
:param video_file: アップロードする動画ファイル | |
""" | |
gauth = GoogleAuth() | |
gauth.CommandLineAuth() | |
drive = GoogleDrive(gauth) | |
folder_id = os.environ['FOLDER_ID'] # FOLDER_IDは環境変数から取得 | |
f = drive.CreateFile({'title': video_file, | |
'mimeType': 'video/mp4', | |
'parents': [{'kind': 'drive#fileLink', | |
'id': folder_id}]}) | |
f.SetContentFile(video_file) | |
f.Upload() |
コード全体は下の通りです。↓
""" | |
Copyright (c) 2013 Daniel Bader (http://dbader.org) | |
License: MIT | |
https://github.com/dbader/schedule | |
Copyright(c) 2020 Tatsuro Watanabe | |
""" | |
import cv2 | |
from datetime import datetime | |
import glob | |
import os | |
import shutil | |
from pydrive.auth import GoogleAuth | |
from pydrive.drive import GoogleDrive | |
import schedule | |
def make_video_from_image(path, size, video_file): | |
""" | |
画像ファイルから動画を作成 | |
:param path: 画像ファイルのパス | |
:param size: 画像ファイルのサイズ | |
:param video_file: 動画ファイル(mp4) | |
""" | |
image_path = path + '/*.jpg' | |
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') | |
video = cv2.VideoWriter(video_file, fourcc, 20.0, size) | |
for filename in sorted(glob.glob(image_path)): | |
img = cv2.imread(filename) | |
img = cv2.resize(img, size) | |
video.write(img) | |
video.release() | |
def delete_all_files(path): | |
""" | |
指定したフォルダを削除後、再作成 | |
:param path: 削除するフォルダ | |
""" | |
shutil.rmtree(path) | |
os.mkdir(path) | |
def upload_to_google_drive(video_file): | |
""" | |
googleドライブに動画ファイルをアップロードする | |
:param video_file: アップロードする動画ファイル(mp4) | |
""" | |
gauth = GoogleAuth() | |
gauth.CommandLineAuth() | |
drive = GoogleDrive(gauth) | |
folder_id = os.environ['FOLDER_ID'] # FOLDER_IDは環境変数から取得 | |
f = drive.CreateFile({'title': video_file, | |
'mimeType': 'video/mp4', | |
'parents': [{'kind': 'drive#fileLink', | |
'id': folder_id}]}) | |
f.SetContentFile(video_file) | |
f.Upload() | |
def main(): | |
display_size = (400, 300) # 表示するサイズ | |
cap = cv2.VideoCapture(0) | |
path = 'video_image' # 画像ファイルのパス | |
video_file = 'out.mp4' # 動画ファイル | |
# 毎日9:00に実行 | |
schedule.every().day.at("09:00").do(make_video_from_image, | |
path=path, | |
size=display_size, | |
video_file=video_file) | |
# 毎日9:10に実行 | |
schedule.every().day.at("09:10").do(upload_to_google_drive, | |
video_file=video_file) | |
# 毎日9:20に実行 | |
schedule.every().day.at("09:20").do(delete_all_files, | |
path=path) | |
while True: | |
ok, frame = cap.read() | |
if not ok: | |
continue | |
# 何らかのキーが押されたら終了 | |
if cv2.waitKey(1) != -1: | |
break | |
display_image = cv2.resize(frame, display_size) | |
# 現在時刻を取得 | |
now = datetime.now() | |
now_str = now.strftime('%m%d%H%M%S%f') | |
# 表示する | |
cv2.imshow('window', display_image) | |
# 画像ファイルに書き込む | |
image_file = now_str + ".jpg" | |
f = os.path.join(path, image_file) | |
cv2.imwrite(f, frame) | |
schedule.run_pending() | |
# カメラの終了処理 | |
cap.release() | |
cv2.destroyAllWindows() | |
if __name__ == '__main__': | |
main() |
複数の画像ファイルから動画を作成する関数make_video_from_imageとGoogleドライブに動画ファイルをアップロードする関数upload_to_google_driveと指定したフォルダを削除後再作成する関数delete_all_filesを指定の時刻に実行するようにしました。Scheduleモジュールについて詳しくは下のサイトを見てください。↓
https://schedule.readthedocs.io/en/stable/
2020年3月18日18:14
カテゴリ: プログラミング
タグ: Python, Raspberry Pi, OpenCV,
便利ツールにパスワード作成ツールを追加しました。GitHubにプログラムをアップしたので、よかったら見てください。↓
2020年3月14日11:51
カテゴリ: 便利ツールの紹介
便利ツールに緯度・経度から標高を取得するツールを追加しました。このツールは国土地理院の「サーバサイドで経緯度から標高を求めるプログラム」を利用しました。GitHubに作成したプログラムをアップしましたので、よかったら見てください。↓
ktpcschool/geocoding/elevation.py
2020年3月11日16:08
カテゴリ: 便利ツールの紹介