ライブ表示と画像のスケーリング
概要
品質保証のための製品の検査を行う際、カメラで撮影した画像をリアルタイムで表示し、同時に詳細な検査のために特定の部分を拡大(スケーリング)することがあります。これにより、製品の欠陥を早期に検出し、生産効率を高めることが可能になります。ここではOpenCVを使ってスケーリングする方法について記載しています。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# カメラのビデオキャプチャを開始
cap = cv2.VideoCapture(0)
#解説3
while True:
# スケーリングの係数
scale_factor = 0.5
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームのサイズを変更(スケーリング)
scaled_frame = cv2.resize(frame, None, fx=scale_factor, fy=scale_factor)
# 結果を表示
cv2.imshow('Scaled', scaled_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:
# スケーリングの係数
scale_factor = 0.5
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームのサイズを変更(スケーリング)
scaled_frame = cv2.resize(frame, None, fx=scale_factor, fy=scale_factor)
# 結果を表示
cv2.imshow('Scaled', scaled_frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ここではカメラのフレームを随時処理しながら表示するためのループ処理をしています。まず、 cap.read()
でカメラから1フレームを読み込み、この関数ではret
にフレームの読み込みが成功したかどうかを示すTrue/FalseのBoolean値、frame
は読み込んだフレームのデータが格納されます。後にif文でret
を参照し、フレームが取得できていなかった場合はループを中断します。
cv2.resize
関数は、OpenCVライブラリの一部で、画像のサイズを変更するために使用され、この関数は指定された比率に基づいて元の画像の幅と高さを変更します。
cv2.resize(frame, None, fx=scale_factor, fy=scale_factor)
の第1引数frame
は、サイズを変更したいカメラから取得した画像です。
第2引数None
は、出力画像の目的のサイズを指定する位置です。しかし、ここではNoneが設定されているため、出力画像のサイズは次の2つの引数、すなわち第三引数fx
と第四引数fy
を使用し、それぞれにはscale_factor = 0.5
が代入されています。
第三引数と第四引数fxとfyは、それぞれ画像の幅と高さのスケーリング(拡大縮小)係数を指定します。ここでは、scale_factor(この場合は0.5)が両方に設定されています。これにより、元の画像の幅と高さが同じ比率で変更され、結果として得られる画像は元の画像と同じアスペクト比を維持します。
最後にcv2.imshow('Scaled', frame)
でスケーリングされた画像を画面に表示し、'Scaled'は表示ウィンドウの名前です。 cv2.waitKey(1)
はキーボードからの入力を1ミリ秒待ちます。そして& 0xFF == ord('q')
の部分で、入力されたキーが'q'であればループを抜ける(プログラムを終了する)ようにしています。
SDKでのスケーリング
画像データのスケーリングはThe Imaging Source社のSDKにも機能として要されています。
非常に簡単かつ低負荷で実装が可能なので、ぜひ用途にあればご確認ください。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/dotnet_35/scroll-and-zoom.html
解説4: リソースの解放
# キャプチャをリリースし、ウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()
ここでは、使用が終わったリソースを適切に解放しています。
まず、 cap.release()
はプログラムが終了した際にリソースのリークを防ぐためにカメラデバイスを解放します。この呼び出しを忘れると、カメラが他のプログラムから使用できなくなる可能性があります。
最後にcv2.destroyAllWindows()
は、OpenCVで開かれた全てのウィンドウを閉じます。