静止画保存とタイムスタンプの追加
概要
カメラから取得した画像にタイムスタンプすることは、画像がいつ撮影されたかを明確にするために重要な機能です。例えば、監視カメラの映像や実験の結果を記録する際には、画像がいつ撮影されたかを知ることが重要です。この機能は、OpenCVとPythonのdatetimeライブラリを使用して簡単に実装することができます。
出力結果
プログラム全体
#解説1
import cv2
import datetime
#解説2
# UVCカメラを開く
cap = cv2.VideoCapture(0)
#解説3
# カメラから画像を取得
ret, image = cap.read()
#解説4
# 現在の日時を取得
now = datetime.datetime.now()
timestamp = now.strftime('%Y-%m-%d %H:%M:%S')
#解説5
# 画像にタイムスタンプを追加
cv2.putText(image, timestamp, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
#解説6
# 画像を表示
cv2.imshow('Image with timestamp', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# カメラを解放
cap.release()
解説
解説1: OpenCVライブラリのインポート
import cv2
import datetime
OpenCVは、画像処理やコンピュータビジョンのためのオープンソースライブラリです。これを使うことで、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。また、datetimeライブラリはsシステムの日付と時間を取得するために使用します。
解説2: カメラの起動
# UVCカメラを開始
cap = cv2.VideoCapture(0)
ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)
という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCapture
オブジェクトを返しています。ここでの0
は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。
補足:OpenCVにおけるデバイスID
デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。
TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html
解説3: 画像の取得
# カメラから画像を取得
ret, image = cap.read()
カメラから1フレームの画像を取得します。cap.read()
は、カメラから画像を読み込むためのメソッドで、ret
とimage
のそれぞれに値を返します。ret
は画像の読み込みが成功したかどうかを示すブール値(TrueまたはFalse)、image
は取得した画像データです。
解説4: 現在の日時の取得
# 現在の日時を取得
now = datetime.datetime.now()
timestamp = now.strftime('%Y-%m-%d %H:%M:%S')
datetime.datetime.now()
を使用して現在の日時を取得します。その後、strftime('%Y-%m-%d %H:%M:%S')
を使用して日時を文字列に変換します。この文字列は解説5で画像にタイムスタンプとして追加します。
解説5: 画像にタイムスタンプを追加
# 画像にタイムスタンプを追加
cv2.putText(image, timestamp, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
cv2.putText()
を使用して画像にタイムスタンプを追加します。この関数は画像にテキストを描画するためのもので、引数の内容は以下のようになっています。
第1引数 image: テキストを描画する画像
第2引数 timestamp: 描画するテキスト(ここでは解説4で取得したタイムスタンプ)
第3引数 (10, 30): テキストを描画する位置(左下隅からのピクセル単位の座標)
第4引数 cv2.FONT_HERSHEY_SIMPLEX: 使用するフォント
第5引数 1: フォントのスケール(テキストのサイズ)
第6引数 (255, 255, 255): テキストの色(BGR形式)
第7引数 2: テキストの線の太さ
補足:産業用カメラの画像タイムスタンプ情報
TheImagingSource社のSDK(ICImagingControl)ではカメラから送られる画像ごとにフレーム番号やタイムスタンプが保存されています。詳細は下記をご覧ください。
https://www.argocorp.com/software/sdk/ICImagingControl/users_guide_35/reference/ref/FrameMetadata.htm
解説6: 画像の表示
# 画像を表示
cv2.imshow('Image with timestamp', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow()
を使用して画像を表示します。この関数の第一引数はウィンドウの名前で、第二引数は表示する画像です。cv2.waitKey(0)
を呼び出すことで、ユーザーがキーを押すまで表示を続けます。最後にcv2.destroyAllWindows()
を呼び出すことで、開いたすべてのウィンドウを閉じます。
解説7: 画像の保存
# 画像を保存
cv2.imwrite('image_with_timestamp.jpg', image)
cv2.imwrite()
を使用して画像を保存します。この関数の第一引数は保存するファイルの名前で、第二引数は保存する画像を指定します。
解説8: カメラの解放
# カメラを解放
cap.release()
cap.release()
を呼び出すことで、カメラリソースを解放します。これは、他のプログラムがカメラを使用できるようにするため必ず呼び出すようにしてください。