文字数カウンターを追加

便利ツールに文字数カウンターを追加しました。文字数を調べたいテキストを入力または貼付けするとリアルタイムで反映されるようになっています。

2020年3月20日19:51

カテゴリ: 便利ツールの紹介

タグ: 便利ツール,


OpenCVとPythonで取得した画像を動画にしてGoogleドライブに自動アップロードする

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にプログラムをアップしたので、よかったら見てください。↓

ktpcschool/password_generator

2020年3月14日11:51

カテゴリ: 便利ツールの紹介

タグ: Python, 便利ツール,


アスキーアート変換ツールのアスキーアート画像のサンプル

サムネイル画像をクリックすると、実際の画像が見られます。↓


ascii_monalisa ascii_cat ascii_dog  

2020年3月11日17:39

カテゴリ: 便利ツールの紹介

タグ: 便利ツール,


緯度・経度から標高を取得するツールを追加

便利ツールに緯度・経度から標高を取得するツールを追加しました。このツールは国土地理院の「サーバサイドで経緯度から標高を求めるプログラム」を利用しました。GitHubに作成したプログラムをアップしましたので、よかったら見てください。↓

ktpcschool/geocoding/elevation.py

2020年3月11日16:08

カテゴリ: 便利ツールの紹介

タグ: Python, 便利ツール,