HBVCAM-8M1824U3 V11、本当は何FPSで写真の連続撮影が可能なのか知りたいと思い、FPS確認プログラムを作成してみたが、どうにも3回か4回撮影すると1秒の待ち時間が発生してしまい、3FPSになってしまう。

いろいろ試してみて、大ボケしていたことが判明。

cap.set(cv2.CAP_PROP_EXPOSURE, 0)
asyncio.run(asyncio.sleep(7)) # 反映待ち

露光時間0=1秒、そりゃあ変な動作するわな!
# 0=1s,-1=500ms,-2=250ms,-3=125ms,-4=62.5ms,-5=31.3ms,-6=15.6ms,-7=7.8ms,-8=3.9ms
# -9=2ms,-10=976.6μs,-11=488.3μs,-12=244.1μs,-13=122.1μs,-14=61.5μs,-15=30.7μs,-16=15.3μs

露光時間を-4を予定すると0.1秒程度の時間待ちが必要か。
import os
import cv2
import numpy as np
import datetime
import asyncio # プログラム全体を止めない非同期待ち時間指定用、asyncio.run(asyncio.sleep(4)) で4秒待ち

os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0" #カメラ起動の短縮

def print_camera_properties(CAMERA_ID):
    print("カメラプロパティ:")
    print(" - CAP_PROP_FRAME_WIDTH:  ", cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    print(" - CAP_PROP_FRAME_HEIGHT: ", cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 撮影回数設定
time_n = 30

image_path = "c:/code/py311/Ta2S Inspection soft/image/"

ut_now = datetime.datetime.now()
print(ut_now, 'Capture用カメラ割り当て')
# カメラのデバイスID
CAMERA_ID = 0
# カメラをキャプチャするオブジェクトを作成
cap = cv2.VideoCapture(CAMERA_ID)

# カメラがオープンされているか確認
if not cap.isOpened():
    print("Could not open camera")
    exit()

ut_now = datetime.datetime.now()
print(ut_now, 'Capture SETTING')
# カメラの設定を変更
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用
#cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) #OpenCVの遅延を短くする(初期値は4)(動画でないので効かない?)
# カメラの自動露光調整をOFFに設定し、カメラの明るさを調整
# 0=1s,-1=500ms,-2=250ms,-3=125ms,-4=62.5ms,-5=31.3ms,-6=15.6ms,-7=7.8ms,-8=3.9ms
# -9=2ms,-10=976.6μs,-11=488.3μs,-12=244.1μs,-13=122.1μs,-14=61.5μs,-15=30.7μs,-16=15.3μs
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0)
asyncio.run(asyncio.sleep(1)) # 反映待ち
cap.set(cv2.CAP_PROP_EXPOSURE, -4)
asyncio.run(asyncio.sleep(7)) # 反映待ち
# カメラの自動ホワイトバランス調整をOFFに設定
cap.set(cv2.CAP_PROP_AUTO_WB, 0)
asyncio.run(asyncio.sleep(1)) # 反映待ち
#cap.set(cv2.CAP_PROP_WB_TEMPERATURE, 0)

ut_now = datetime.datetime.now()
print(ut_now, 'PREREAD')
frame00 = cap.read() #本スキャン時の遅延を短くするための事前スキャン
frame00 = cap.read() #本スキャン時の遅延を短くするための事前スキャン
print_camera_properties(CAMERA_ID)

# マニュアルフォーカスの値を設定する
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # オートフォーカスを無効にする
asyncio.run(asyncio.sleep(2)) # 反映待ち
cap.set(cv2.CAP_PROP_FOCUS, 240) # フォーカス設定
asyncio.run(asyncio.sleep(2)) # 反映待ち
frame00 = cap.read()

# 画像を取得して平均化
ut_now = datetime.datetime.now()
ut_now0 = ut_now
print(ut_now, 'CAP 1-',time_n)

images = []
for i in range(time_n):
    ret, frame = cap.read()
    asyncio.run(asyncio.sleep(0.1)) # 反映待ち
    ut_now = datetime.datetime.now()
    print(ut_now, 'CAP')
    if not ret:
        print("Could not read frame")
        exit()
    images.append(frame)

ut_now = datetime.datetime.now()
elapsed_time = (ut_now - ut_now0).total_seconds()
# Calculate FPS
fps_n = time_n / elapsed_time
print('time',time_n,' ',elapsed_time,' FPS ',fps_n)
print(ut_now, 'CAP終了/ノイズ除去開始')
average_image = np.mean(images, axis=0)

ut_now = datetime.datetime.now()
print(ut_now, 'ノイズ除去結果の保存')
# 平均化した画像を保存
cv2.imwrite(image_path+"Numpyaverage_image000.png", average_image)

cv2.waitKey(0)

ut_now = datetime.datetime.now()
print(ut_now, '結果保存終了')
# カメラをリリース
cap.release()

実際動作させてみると、安定した連続撮影が出来、7FPS程度になった。
2024-03-03 18:03:14.415599 Capture用カメラ割り当て
2024-03-03 18:03:15.767113 Capture SETTING
2024-03-03 18:03:28.540826 PREREAD
カメラプロパティ:
 - CAP_PROP_FRAME_WIDTH:   3264.0
 - CAP_PROP_FRAME_HEIGHT:  2448.0
2024-03-03 18:03:33.462344 CAP 1- 30
2024-03-03 18:03:33.622342 CAP
2024-03-03 18:03:33.749522 CAP
2024-03-03 18:03:33.889597 CAP
2024-03-03 18:03:34.014558 CAP
2024-03-03 18:03:34.154276 CAP
2024-03-03 18:03:34.280641 CAP
2024-03-03 18:03:34.437809 CAP
2024-03-03 18:03:34.576937 CAP
2024-03-03 18:03:34.703308 CAP
2024-03-03 18:03:34.842451 CAP
2024-03-03 18:03:34.982195 CAP
2024-03-03 18:03:35.122347 CAP
2024-03-03 18:03:35.262084 CAP
2024-03-03 18:03:35.403011 CAP
2024-03-03 18:03:35.542202 CAP
2024-03-03 18:03:35.682391 CAP
2024-03-03 18:03:35.823616 CAP
2024-03-03 18:03:35.962624 CAP
2024-03-03 18:03:36.104298 CAP
2024-03-03 18:03:36.246372 CAP
2024-03-03 18:03:36.386268 CAP
2024-03-03 18:03:36.526361 CAP
2024-03-03 18:03:36.665066 CAP
2024-03-03 18:03:36.804871 CAP
2024-03-03 18:03:36.960813 CAP
2024-03-03 18:03:37.118237 CAP
2024-03-03 18:03:37.274354 CAP
2024-03-03 18:03:37.437765 CAP
2024-03-03 18:03:37.579598 CAP
2024-03-03 18:03:37.751866 CAP
time 30   4.290523  FPS  6.9921545695012
2024-03-03 18:03:37.752867 CAP終了/ノイズ除去開始
2024-03-03 18:03:39.196131 ノイズ除去結果の保存
2024-03-03 18:03:39.413431 結果保存終了

光量を上げて、露光時間を短くすれば、購入ページに載っていた15FPSが出るんだろうけども・・・
透過光検査もするのであれば15FPSは絶対に無理!!!
けれども、ローリングシャッターのUSBカメラは連続撮影していて、ret, frame = cap.read()で
撮影済のデータを出力してくるだけなので、15FPSといえば15FPSか・・・

まあ、いい勉強になりました(´;ω;`)

コメント

このブログの人気の投稿