静止画保存と画像のクロッピング
概要
画像のクロッピングは、画像の特定の領域を切り出す機能です。クロッピングをすることで、ターゲットとなる画像を絞り込みながら不要な要素を削除することで、画像サイズを調整することができます。また、データ量を削減し、画像処理の計算時間を短縮することにもつながります。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# UVCカメラを開く
cap = cv2.VideoCapture(0)
#解説3
# カメラから画像を取得
ret, image = cap.read()
#解説4
# 画像をクロッピング
cropped_image = image[100:200, 100:200]
#解説5
# 画像を表示
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
#解説6
# 画像を保存
cv2.imwrite('original_image.jpg', image)
cv2.imwrite('cropped_image.jpg', cropped_image)
# カメラを解放
cap.release()
解説
解説1: OpenCVライブラリのインポート
import cv2
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, image = cap.read()
カメラから1フレームの画像を取得します。cap.read()
は、カメラから画像を読み込むためのメソッドで、ret
とimage
のそれぞれに値を返します。ret
は画像の読み込みが成功したかどうかを示すブール値(TrueまたはFalse)、image
は取得した画像データです。
解説4: 画像のクロッピング
# 画像をクロッピング
cropped_image = image[100:200, 100:200]
画像の一部を切り取る(クロッピング)には、Pythonのスライス機能を使用します。image[100:200, 100:200]
は、画像の100ピクセル目から200ピクセル目までの領域を切り取ります。ここでの100:200は、スタート位置とストップ位置を指定するスライスです。最初の100:200は縦の位置(高さ)、2つ目の100:200は横の位置(幅)を指定します。
補足:クロッピングのタイミングについて
上記の例ではカメラから出力された画像をPCに取り込んだ後に画像の切り出しを行っていますが、カメラメーカーのSDK(ICImagingControl)を使用するとカメラ側で画素切り出しを行うことができます。カメラから画像の特定の領域だけを処理するため、送信される画像データを初めから削減できます。これによって、出力画像1枚当たりの解像度を落とせば、設定可能フレームレートを向上させることができます。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/roi-setting.html
解説5: 画像の表示
# 画像を表示
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow()
を使用して画像を表示します。この関数は2つの引数を取ります。最初の引数はウィンドウの名前で、2つ目の引数は表示する画像です。その後、cv2.waitKey(0)
を呼び出すことで、ユーザーがキーを押すまで表示を続けます。最後に、cv2.destroyAllWindows()
を呼び出すことで、開いたすべてのウィンドウを閉じます。
解説6: 画像の保存
# 画像を保存
cv2.imwrite('original_image.jpg', image)
cv2.imwrite('cropped_image.jpg', cropped_image)
cv2.imwrite()
を使用して画像を保存します。この関数の第一引数は保存するファイルの名前で、第二引数は保存する画像を指定します。ここでは、元の画像とクロッピングした画像の2つを保存しています。
解説7: カメラの解放
# カメラを解放
cap.release()
ここでは、カメラリソースを解放しています。カメラやファイルなどのリソースを開いた後は、それらがもう必要ないときには必ず解放する必要があります。これにより、そのリソースを他のプログラムが使用できるようになります。この行がないと、プログラムが終了してもカメラが開いたままになり、他のプログラムから使用できなくなる可能性があります。