静止画保存と画像のローテーション
概要
画像のローテーションは、ワークの画像を様々な角度から検査するために使用されます。例えば、生産ライン上でワークはさまざまな向きに配置される可能性があり、画像を回転させることで、どの角度からでも製品を正確に検査することが可能になります。
出力結果
オリジナルの画像 |
45度回転した画像 |
プログラム全体
#解説1
import cv2
#解説2
# UVCカメラを開く
cap = cv2.VideoCapture(0)
#解説3
# カメラから画像を取得
ret, image = cap.read()
#解説4
# 画像の中心を取得
height, width = image.shape[:2]
center = (width // 2, height // 2)
#解説5
# 回転角度とスケールを設定(ここでは45度に設定)
angle = 45
scale = 1.0
#解説6
# 回転行列を計算
matrix = cv2.getRotationMatrix2D(center, angle, scale)
#解説7
# 画像を回転
rotated_image = cv2.warpAffine(image, matrix, (width, height))
#解説8
# 画像を表示
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
#解説9
# 画像を保存
cv2.imwrite('original_image.jpg', rotated_image)
cv2.imwrite('rotated_image.jpg', rotated_image)
# カメラを解放
cap.release()
解説
解説1: ライブラリのインポート
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()
cap.read()
はカメラから一枚の画像を取得します。cap.read()
は、カメラから画像を読み込むためのメソッドで、retとimageのそれぞれに値を返します。ret
は画像の読み込みが成功したかどうかを示すブール値(TrueまたはFalse)、image
は取得した画像データです。
解説4: 画像の中心の取得
# 画像の中心を取得
height, width = image.shape[:2]
center = (width // 2, height // 2)
画像の中心座標を計算しています。image.shape[:2]
で画像の高さと幅を取得し、高さと幅を2で割ることで中心座標を計算しています。中心座標は後で画像を回転させる際の基準点として使用します。
解説5: 回転角度とスケールの設定
# 回転角度とスケールを設定(ここでは45度に設定)
angle = 45
scale = 1.0
画像を回転させる際の角度とスケール(拡大率)を設定しています。角度は45度、スケールは1.0(サイズは変更しない)に設定しています。
解説6: 回転行列の計算
# 回転行列を計算
matrix = cv2.getRotationMatrix2D(center, angle, scale)
cv2.getRotationMatrix2D
関数関数は、指定した中心座標、角度、スケールに基づいて画像を回転させるための行列を生成しています。
解説7: 画像の回転
# 画像を回転
rotated_image = cv2.warpAffine(image, matrix, (width, height))
cv2.warpAffine
関数を使って画像を回転します。この関数は、解説6で生成した回転行列に基づいて画像を変換(回転)します。
補足:SDKでの画像ローテーション
TheImagingSourceのSDKでもカメラのプロパティ設定で0度、90度、180度、270度の角度で画像を回転させることが可能です。
https://www.argocorp.com/software/sdk/ICImagingControl/users_guide/stdfilter/stdfilterRotateFlip.htm
解説8: 画像の表示
# 画像を表示
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow
関数を使って回転後の画像を表示しています。cv2.waitKey(0)
はキーボード入力を待つ関数で、ここでは何らかのキーが押されるまで画像表示ウィンドウを開いたままにします。cv2.destroyAllWindows()
はすべてのウィンドウを閉じる関数です。
解説9: 画像の保存とカメラの解放
# 画像を保存
cv2.imwrite('original_image.jpg', rotated_image)
cv2.imwrite('rotated_image.jpg', rotated_image)
# カメラを解放
cap.release()
cv2.imwrite
関数を使って回転後の画像をファイルに保存しています。
最後に、カメラリソースを解放しています。カメラやファイルなどのリソースを開いた後は、それらがもう必要ないときには必ず解放する必要があります。これにより、そのリソースを他のプログラムが使用できるようになります。この行がないと、プログラムが終了してもカメラが開いたままになり、他のプログラムから使用できなくなる可能性があります。