ライブ表示を行い、フォーカス制御する方法
概要
フォーカス調整はカメラの画像のピントを調整するための機能です。特に、撮影対象物とカメラの距離が変わる場合や、特定の箇所に焦点を合わせたい場合に有効です。FA(Factory Automation)では固定フォーカスのレンズが一般的ですが、フォーカス調整が可能なカメラを使用すると、撮影対象物の大きさや位置が変わった場合でもソフトウェア側でピントを変更ができます。これにより、より奥行のあるワークの撮影が対応可能となります。
補足:オートフォーカスの原理とは?
オートフォーカスの原理は画像のエッジを検出し、フォーカス値にフィードバックする事です。画像のエッジ(色や明るさが急激に変化する部分)が強く検出される画像はいわゆる人の目で見るピントのあっている画像で、オートフォーカスではこれらをリアルタイムに計測し、フォーカス値を調整する事で、自動的にピントの合う画像が得られるという流れとなっています。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# カメラのビデオキャプチャを開始
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#解説3
# フォーカスを手動モードに設定(可能な場合)
# 注意: このプロパティはすべてのカメラでサポートされているわけではありません
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # 0 = OFF, 1 = ON
#解説4
# フォーカスの値を設定(可能な場合)
# 注意: このプロパティはすべてのカメラでサポートされているわけではありません
focus_value=100
cap.set(cv2.CAP_PROP_FOCUS, focus_value)
# フォーカスの値を取得し、設定した値と一致するか確認
if cap.get(cv2.CAP_PROP_FOCUS) != focus_value:
print("フォーカスの調整ができませんでした。")
else : print("フォーカス調整完了")
print(cap.get(cv2.CAP_PROP_FOCUS))
#解説5
while True:
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームを表示
cv2.imshow('Forcus is : '+ str(focus_value) , frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#解説6
# キャプチャをリリースし、ウィンドウを閉じる
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: フォーカスモードの設定
# フォーカスを手動モードに設定(可能な場合)
# 注意: このプロパティはすべてのカメラでサポートされているわけではありません
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # 0 = OFF, 1 = ON
カメラのフォーカスモードを手動に設定しています。cv2.CAP_PROP_AUTOFOCUS
は、カメラのオートフォーカスモードを制御するプロパティです。0
を設定するとオートフォーカスがオフ(手動フォーカス)になり、1
を設定するとオートフォーカスがオンになります。ただし、すべてのUVCカメラがオートフォーカスあるいは手動フォーカス調整に対応しているわけではありませんので注意してください。
解説4: フォーカス値の設定と確認
# フォーカスの値を設定(可能な場合)
# 注意: このプロパティはすべてのカメラでサポートされているわけではありません
focus_value=300
cap.set(cv2.CAP_PROP_FOCUS, focus_value)
# フォーカスの値を取得し、設定した値と一致するか確認
if cap.get(cv2.CAP_PROP_FOCUS) != focus_value:
print("フォーカスの調整ができませんでした。")
else : print("フォーカス調整完了")
print(cap.get(cv2.CAP_PROP_FOCUS))
カメラのフォーカス値を設定し、その設定が正しく適用されたかを確認しています。cv2.CAP_PROP_FOCUS
は、カメラのフォーカス値を制御するプロパティです。設定した値と取得した値が一致しない場合、フォーカスの調整ができなかったというメッセージを出力します。
解説5: ビデオフレームの取得と表示
while True:
# フレームをキャプチャ
ret, frame = cap.read()
if not ret:
break
# フレームを表示
cv2.imshow('Forcus is : '+ str(focus_value) , frame)
# 'q'キーが押されたらループから抜ける
if cv2.waitKey(1) & 0xFF == ord('q'):
break
カメラが正常に開いている間、while文でループ処理をしています。ループ処理の中で、 cap.read()
を使ってカメラから1フレームを読み込み、この関数ではret
にフレームの読み込みが成功したかどうかを示すTrue/FalseのBoolean値、frame
は読み込んだフレームのデータが格納されます。その後ret
を参照して、フレームが取得できていなかった場合は処理を中断しています。
最後にcv2.imshow('Live', frame)
で読み込んだフレームを画面に表示します。ここで'Live'は表示ウィンドウの名前です。 cv2.waitKey(1)
はキーボードからの入力を1ミリ秒待ちます。そして& 0xFF == ord('q')
の部分で、入力されたキーが'q'であればループを抜ける(プログラムを終了する)ようにしています。
解説6: デバイスの開放
# キャプチャをリリースし、ウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()
ここでは、使用が終わったリソースを適切に解放しています。
まず、 cap.release()
はプログラムが終了した際にリソースのリークを防ぐためにカメラデバイスを解放します。この呼び出しを忘れると、カメラが他のプログラムから使用できなくなる可能性があります。
最後にcv2.destroyAllWindows()
は、OpenCVで開かれた全てのウィンドウを閉じます。
補足:今回使用したカメラ(DFK AFUJ003-M12)
今回はDFK AFUJ003-M12というカメラを使用しています、これは産業用カメラですがUVC規格にも対応しており、OpenCVからフォーカス調整も可能です。
https://www.argocorp.com/cam/special/TIS_af/DFK_DMK-F.html