画像にテキストを書き込む方法

OpenCV を利用して、画像にテキストを書き込むには putText メソッドを利用する。putText は 9 個の引数を受け取ることができる。

import cv2 as cv
img = cv.imread('sample.jpg')
cv.putText(img, 'Flowers', (0, 50), cv.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 5, cv.LINE_AA)
cv.imwrite('sample.2.jpg', img)
処理前処理後
OpenCV putText 処理前の画像
OpenCV putText 処理前の画像
順位引数
1imgcv.imread で開いた画像オブジェクト。
2text書き込む文字列。
3org書き込む位置。文字列の左下の角が指定の位置に配置される。
4fontFaceフォントスタイル。CV_FONT_HERSHEY_PLAINCV_FONT_HERSHEY_SCRIPT_SIMPLEX などを指定できる。
5fontScaleフォントサイズ。
6colorフォントの色。
7thicknessフォントの太さ。
8lineType48cv.LINE_AA のいずれかを指定できる。

サンプルコード

写真から撮影時刻を取得し、その時刻を写真に書き込んで保存する。写真から撮影時刻を取得するとき、PIL モジュールの機能を利用する。

import PIL
from PIL import Image
from PIL import ExifTags
import cv2 as cv

def get_exif(image_path):
    captured_datetime = None
    with Image.open(image_path) as imgfh:
        try:
            exif = imgfh._getexif()
            for attr, val in exif.items():
                tag = ExifTags.TAGS.get(attr, attr)
                if tag == 'DateTimeOriginal':
                    captured_datetime = val
        except AttributeError:
            pass
    return captured_datetime

def write_text(image_path):
    captured_datetime = get_exif(image_path)
    
    img = cv.imread(image_path)
    cv.putText(img, captured_datetime, (10, 30),
               cv.FONT_HERSHEY_PLAIN, 1.5,
               (255, 255, 255), 1, cv.LINE_AA)
    cv.imwrite(image_path + '.new.jpg', img)

if __name__ == '__main__':
    write_text('sample.jpg')
処理前処理後
OpenCV putText 処理前の画像
OpenCV putText 処理前の画像