OpenCV の実用的で便利なコード集-カメラ調整編 (Python)

OpenCV
スポンサーリンク

スポンサーリンク

はじめに

前回の記事の続きを書いていきます。

今回は、明るさ調整や露光調整について説明していきます。
被写体が動いても画像がぶれないような撮影ができるようになります。

前提条件

前提条件は、以下の通りです。

  • Python == 3.9.13
  • opencv-python == 4.6.0
  • numpy == 1.23.4
  • Windows11

また、今回はロジクールの C1000eR を使用します。

ベースプログラムの確認

前回の記事で作成した、カメラキャプチャ用のベースプログラムを用意します。

import cv2

cap = cv2.VideoCapture(1, cv2.CAP_DSHOW)
i = 0

cap.set(cv2.CAP_PROP_SETTINGS, 0)

while True:
    ret, frame = cap.read()
    if ret:
        cv2.imshow("window name", frame)
    lastkey = cv2.waitKey(1)
    if lastkey == ord("q"):
        cap.release()
        cv2.destroyAllWindows()
        break
    if lastkey == ord("c"):
        cv2.imwrite("frame_" + str(i) + ".png", frame)
        i += 1

今回はロジクールの C1000eR を使用するので、調整項目が増えています。

C925e も、まったく同じ調整項目です。

露光の調整

露光時間を調整すると、被写体のブレが減ります

こちらの Wikipediaの記事 が参考になると思います。

実際に、やってみましょう。露出を -2 にしてから、カメラを振りながら C で撮影してみてください。

ブレます、そして光源が明るすぎてボケてしまいます。

今度は露出を -6 にして同様に撮影してみてください。

かなりカメラを強く振ってもブレなくなります。
全体的に暗くなりますが、照明の影響を非常に強く受けない限りはボケません。

この露光は、画像検査やQRコード認識で非常に重要になります。
上記のようなアイテムを提供しているメーカーは、発光タイミングと撮影タイミングを同期させたりして、被写体のブレやボケ、外乱光の影響を可能な限り取り除いています。

ピントの調整

次に、ピントを調整していきます。

C1000eR は、オートフォーカスの性能が高いので150mm ~ 600mm 程度であれば自動でピント調整してくれます。
なので、600mm 先の QRコード も認識可能です。

ではなぜ、ピントの調整が必要かというと

  • 至近距離で撮影
  • オートフォーカスの調整時間を待てない

場合になってきます。オートフォーカスの調整時間はカメラの機種によって様々ですが、0.5s 以上はかかります。

早速、焦点のパラメータを変更してみましょう。

焦点 : 50

焦点 : 200

焦点が 50 のときはキーボードにピントが合っており、200 のときはシャトルにピントが合っています。

至近距離での撮影も可能なので、是非使用してみてください。

エッジ強調

次は、エッジ強調プログラムを作成してみます。

エッジ強調の方法はいくつかありますが、今回は公式サイトより、detailenhance関数を実行しようと思います。
こちらのサイトの detailEnhance の項目をご覧ください。

コードは以下の通りです。

import cv2

cap = cv2.VideoCapture(1, cv2.CAP_DSHOW)
i = 0

cap.set(cv2.CAP_PROP_SETTINGS, 0)

while True:
    ret, frame = cap.read()
    if ret:
        frame = cv2.detailEnhance(frame, sigma_s=10, sigma_r=0.15)
        cv2.imshow("window name", frame)
    lastkey = cv2.waitKey(1)
    if lastkey == ord("q"):
        cap.release()
        cv2.destroyAllWindows()
        break
    if lastkey == ord("c"):
        cv2.imwrite("frame_" + str(i) + ".png", frame)
        i += 1

結果は以下の通りです。

detailEnhance あり

detailEnhance なし

陰影がハッキリしたように見えます。

detaileEnhance を使用すると、QRコードの認識距離を伸ばしたりできるので、是非使用してみてください。

おわりに

以上で第二回の OpenCV の説明は終了となります。

今回は画像検査でUSBカメラを使用する際に必要となる機能を紹介しました。
被写体がうまく映らない方は是非、お試しください。

次回は、OpenCVの便利な関数の続きと、USBカメラの通信について説明できればと思います。

コメント

タイトルとURLをコピーしました