ライブ表示と画像のミラーリング
概要
この記事ではUVCカメラから得られる画像を左右反転して表示や処理を行う方法を紹介します。 工場などの生産ライン等では、特定の製造装置の仕様や物理的な制約(カメラやワークの向き)により、カメラから得られる画像に対してミラーリング、すなわち水平反転の処理が必要な場合があります。 画像検知AIやルールベースでの物体検知等では、撮影する画角やワークの撮影角度が一定であるほうがより高い精度で処理できるので、反転処理を行う場合があります。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# カメラのビデオキャプチャを開始
cap = cv2.VideoCapture(0)
#解説3
while True:
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームを水平方向に反転(ミラーリング)
mirrored_frame = cv2.flip(frame, 1)
# 結果を表示
cv2.imshow('Mirrored', mirrored_frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#解説4
# キャプチャをリリースし、ウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()
解説
解説1: モジュールのインポート
import cv2
PythonのOpenCVライブラリをインポートしています。OpenCVは、画像処理やコンピュータビジョンに関する機能を提供するオープンソースのライブラリです。このライブラリをインポートすることで、後のコードでOpenCVの機能を使うことができます。例えば、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。
解説2: ビデオキャプチャの開始
# カメラのビデオキャプチャを開始
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: フレームのキャプチャとミラーリング
while True:
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームを水平方向に反転(ミラーリング)
mirrored_frame = cv2.flip(frame, 1)
# 結果を表示
cv2.imshow('Mirrored', mirrored_frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ここではカメラのフレームを随時処理しながら表示するためのループ処理をしています。まず、 cap.read()
でカメラから1フレームを読み込み、この関数ではret
にフレームの読み込みが成功したかどうかを示すTrue/FalseのBoolean値、frame
は読み込んだフレームのデータが格納されます。次のif文でret
を参照し、読み込みが失敗していた場合はループ処理を抜けます。
次にcv2.flip
で取得した画像を指定した軸に沿って反転します。ここでは、1
を指定してフレームを水平方向に反転(軸は垂直)しています。
そしてcv2.imshow('camera', frame)
で水平方向に反転された画像を画面に表示します。ここでの'Mirrored'は表示ウィンドウの名前です。
最後に cv2.waitKey(1)
はキーボードからの入力を1ミリ秒待ちます。そして& 0xFF == ord('q')
の部分で、入力されたキーが'q'であればループを抜ける(プログラムを終了する)ようにしています。
補足:SDKやドライバでの反転処理
一部のカメラドライバには、映像を反転させる機能が標準実装されています。これは、カメラが物理的に反転して取り付けられている場合や、特定のアプリケーションが反転映像を必要とする場合などに有効で、この機能自体はドライバの設定メニューやSDKのプロパティから有効化または無効化することができます。 しかし、この設定が誤って変更された場合や、ドライバが正しく機能していない場合、映像が意図しないように反転してしまうことがあります。このような問題を解決するためには、ドライバの設定を確認したり、最新のドライバに更新したり、必要に応じてドライバを再インストールしたりすることが推奨されます。逆に、映像が反転して表示されているなどの不具合はこの機能が原因の可能性が高いです。 TheImagingSourceのSDKも各軸の反転機能に対応しているので是非ご利用ください。 https://www.argocorp.com/software/sdk/ICImagingControl/users_guide/stdfilter/stdfilterRotateFlip.htm
解説4: リソースの解放
#解説4
# キャプチャをリリースし、ウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()
ここでは、使用が終わったリソースを適切に解放しています。
まず、 cap.release()
はプログラムが終了した際にリソースのリークを防ぐためにカメラデバイスを解放します。この呼び出しを忘れると、カメラが他のプログラムから使用できなくなる可能性があります。
最後にcv2.destroyAllWindows()
は、OpenCVで開かれた全てのウィンドウを閉じます。