静止画を保存する際のファイル形式の選択
概要
静止画を保存する際のファイル形式の選択は、画像や用途によって異なります。例えば、BMP形式は非圧縮で高品質な画像を保存できる一方、ファイルサイズが大きくなります。JPEG形式は、データを圧縮することで画像の品質をある程度犠牲にしてでもファイルサイズを小さくしています。また、TIFF形式は、高画質であるため容量が大きいですが、画像編集などに使用されます。これらのファイル形式を用途にあわせて選択する必要があります。
出力結果
BMP形式 |
JPEG形式 |
TIFF形式 |
プログラム全体
#解説1
import cv2
#解説2
# UVCカメラを開く
cap = cv2.VideoCapture(0)
#解説3
# カメラから画像を取得
ret, image = cap.read()
#解説4
# 画像を表示
cv2.imwrite('sample_image.bmp', image)
# JPEG形式で保存
cv2.imwrite('sample_image.jpeg', image)
# TIFF形式で保存
cv2.imwrite('sample_image.tiff', image)
# カメラを解放
cap.release()
解説
解説1: OpenCVライブラリのインポート
import cv2
最初に行うのは、必要なライブラリのインポートです。このコードでは、cv2という名前でOpenCVライブラリをインポートしています。OpenCVは、画像処理やコンピュータビジョンのタスクを行うための強力なライブラリです。
解説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, frame = cap.read()
カメラから1フレームの画像を取得します。cap.read()
は、カメラから画像を読み込むためのメソッドで、retとimageのそれぞれに値を返します。ret
は画像の読み込みが成功したかどうかを示すブール値(TrueまたはFalse)、image
は取得した画像データです。
解説4: 画像の保存
# 画像を表示
cv2.imwrite('sample_image.bmp', image)
# JPEG形式で保存
cv2.imwrite('sample_image.jpeg', image)
# TIFF形式で保存
cv2.imwrite('sample_image.tiff', image)
# カメラを解放
cap.release()
取得した画像を保存するには、cv2.imwrite()
を使用します。この関数は2つの引数を取ります。最初の引数は保存するファイル名(パスを含む)で、2つ目の引数は保存する画像データです。このコードでは、取得した画像をBMP、JPEG、TIFFの3つの形式で保存しています。TIFF形式ではLZW圧縮されて保存されます。ただし、RGB64bitやモノクロ16bit形式での保存はできません。
最後に、cap.release()
を呼び出すことでカメラを解放します。これは、カメラデバイスを他のプロセスやプログラムが使用できるようにするために重要なステップです。プログラムが終了するとき、またはカメラを再度使用する前に、必ずカメラを解放するようにしましょう。
補足:カメラ専用SDKを使ったカラーフォーマット制御
RGB64bitやモノクロ16bit形式で静止画保存が必要な場合はTheImagingSource社のカメラを使う場合には下記のようなSDK(ICImagingControl)を使って保存するようにしましょう。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/image-save-16bit-py.html