HBVCAM-8M1824U3 V11、マニュアルフォーカス指定が不安定で反映されず、フォーカスを動かして反映されることが多かった。

いろいろ試してみて、改善できた。

import cv2
import asyncio # プログラム全体を止めない非同期待ち時間指定用、asyncio.run(asyncio.sleep(4)) で4秒待ち

cap = cv2.VideoCapture(0)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 3264)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 2448)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 3264) # IMX179用
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 2448) # IMX179用

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print("width   = " + str(width))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print("height  = " + str(height))

ret, frame = cap.read()

# オートフォーカスを無効にする
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0)
#cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # IMX179用

# マニュアルフォーカスの値を設定する
# この値を調整することでフォーカス位置を変更できます
focus_value = 0
cap.set(cv2.CAP_PROP_FOCUS, focus_value)
asyncio.run(asyncio.sleep(1)) # 反映待ち

while True:
    ret, frame = cap.read()
    asyncio.run(asyncio.sleep(1)) # 反映待ち
    frame_resized = cv2.resize(frame, (800, 600)) # 画面に収まるようにリサイズ4:3
    cv2.imshow('USB Camera  e(end) 1-3(increase10-30) d(decrease10)', frame_resized)

    key = cv2.waitKey(1)
    if key == ord('e'):
        break
    elif key == ord('1'):
        # フォーカス距離を10増やす
        focus_value += 10
        cap.set(cv2.CAP_PROP_FOCUS, focus_value)
        asyncio.run(asyncio.sleep(1)) # 反映待ち
        print("Focus Increased: ", focus_value)
    elif key == ord('2'):
        # フォーカス距離を20増やす
        focus_value += 20
        cap.set(cv2.CAP_PROP_FOCUS, focus_value)
        asyncio.run(asyncio.sleep(1)) # 反映待ち
        print("Focus Increased: ", focus_value)
    elif key == ord('3'):
        # フォーカス距離を30増やす
        focus_value += 30
        cap.set(cv2.CAP_PROP_FOCUS, focus_value)
        asyncio.run(asyncio.sleep(1)) # 反映待ち
        print("Focus Increased: ", focus_value)
    elif key == ord('d'):
        # フォーカス距離を減らす
        focus_value -= 10
        cap.set(cv2.CAP_PROP_FOCUS, focus_value)
        asyncio.run(asyncio.sleep(1)) # 反映待ち
        print("Focus Decreased: ", focus_value)

cap.release()
cv2.destroyAllWindows()

結局、反映待ち時間を入れることで、きちんと最初から反映されるようになった。

if IMX1 == 2:
    cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # オートフォーカスを無効にする
    asyncio.run(asyncio.sleep(1)) # 反映待ち
    cap.set(cv2.CAP_PROP_FOCUS, FCS) # フォーカス設定
    asyncio.run(asyncio.sleep(1)) # 反映待ち

こんな感じにすることで、USBカメラのオートフォーカスの有無によって、フォーカスを一気に合わせたり、フォーカス設定回避ができるようになった。


前の加工前のシート検査プログラムをUSBカメラ(センサー)を選んで使えるように、Ver1.1にアップデートしてみることにした。

コメント

このブログの人気の投稿