画像データ(フォルダ内の一連のjpegファイル)をモノクロ化して取得日時を書き込み、別のフォルダに出力します。
ファイルのプロパティを見ると、「変更日時」が取得日時に相当していたので、こちらのコードからちょっと変えます。
Windows 10、Python 3.8.5で実行しました。
英数字だけを書き込んでいますが、OpenCVのデフォルトのフォントではなくArialを使いたかったので、日本語の書き込み方を参考にしました。
Python
import cv2 as cv
import numpy as np
import PIL
from PIL import ImageFont, ImageDraw, Image
import os
import glob
import datetime
# 出力先フォルダを指定
output_path = './output/'
# ファイルの変更日時を取得
def get_exif(image_path):
t = os.path.getmtime(image_path)
d = datetime.datetime.fromtimestamp(t)
captured_datetime = d.strftime("%Y/%m/%d %H:%M:%S")
return captured_datetime
# 各ファイルに変更日時を書き込む
def write_text(input_path):
captured_datetime = get_exif(input_path)
image_name = os.path.split(input_path)[1]
img = cv.imread(input_path)
# モノクロ化
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 文字入れ
fontpath ='C:/Windows/Fonts/arialbd.ttf' #Arial Bold
font = ImageFont.truetype(fontpath, 64) # フォントサイズ64
# 表示位置:画像に合わせて調整
position = (30, 1820)
img_pil = Image.fromarray(img_gray)
draw = ImageDraw.Draw(img_pil)
draw.text(position, captured_datetime, font = font , fill = 255) # fill = 255で白
img_gray = np.array(img_pil) # PIL を配列に変換
cv.imwrite(os.path.join(output_path, image_name), img_gray) # ファイル名は同じ
# 元フォルダから一括変換
# 一括変換する前に1枚テストしてフォントサイズや位置を確認しましょう
for f in glob.glob('./input/*.jpg'):
write_text(f)
出力結果イメージ
参考
- Python, OpenCV, NumPyでカラー画像を白黒(グレースケール)に変換
- 画像にテキストを書き込む方法
- Pythonでファイルの作成・更新日時を取得する(os.path.getmtimeなど):作成日時の取得はOSごとに変わるので注意
- TypeError: Can't convert 'datetime.timedelta' object to str implicitly
- strftime() と strptime() の振る舞い
- OpenCV 3.4 + Python3 文字を描画する
- Python + OpenCV でWindowsの日本語フォントを描画する
- pythonでフォルダ内のファイル名のみ取得する方法