カテゴリ |
|
画像を連続で取り込む場合は、以下のGrabサンプルプログラムをベースにお使いください。
◆Grabサンプルプログラム
import sys
import cv2 # OpenCV
import acapy # AcaPy
# ----------------------------------------------------------------
# AcaPyクラスのインスタンス
capture = acapy.AcaPy() # CameraLinkボード, CoaXPressボードのとき
# capture = acapy.AcaPy("GigE") # GigEカメラのとき
if capture.is_opened is False:
# 画像入力ボードが見つからないときは終了
del capture
print("Board or Camera not recognized.")
sys.exit(0)
# iniファイル(ボード設定ファイル)の読込、AcapLib2のiniファイルと共通です。
# GigEカメラのときは不要です。
ret = capture.load_inifile("./AreaSensor_mono.ini")
# 画像表示ウィンドウ作成(qキー入力:終了)
WINDOW_TITLE = "AcaPy Grab Sample [\"q\"=quit]"
cv2.namedWindow(WINDOW_TITLE, cv2.WINDOW_NORMAL)
# ----------------------------------------------------------------
# 画像取込
# 画像取込開始
capture.grab_start()
while True:
# 前回取得した画像の次の画像から今回までの画像をリスト(frames)で取得
ret, frames, count, frame_no = capture.read_frames()
print(f"[grab] FrameNo={frame_no}, count={count}, error_info={ret}")
if ret == 0:
capture.print_last_error()
break
if frames is not None:
# 最新の画像を表示
cv2.imshow (WINDOW_TITLE, frames[count - 1] )
# キー入力
key = cv2.waitKey(1) & 0xFF
if key == ord('q') or key == 27: # q もしくは escキーで終了
break
# 画像取込停止
capture.grab_stop()
cv2.destroyAllWindows()
|
◆Grab処理の流れ
下図に、画像取得の流れを示します。
grab_start()メソッドが実行されると、順次、画像データはPC上のメモリに格納されます。
read_frames()メソッドを実行すると、前回、取得した画像データの次のフレームの画像から、
今回、取得した画像データまでのデータが戻り値(
frames)にリストで格納されます。
下図の例では、フレーム番号
5の撮影中にread_frames()メソッドが呼ばれると、フレーム番号
5の
画像が撮影完了するまで待ってから、前回、取得した画像データのフレームの画像(フレーム番号
3)から、今回、取得した画像データ(フレーム番号
5)のフレーム番号
3、4、5の3枚分の画像データが戻り値(
frames)に格納されます。
最後に、画像入力を停止する際は、
grab_stop()メソッドを実行します。
grab_start()メソッドを実行したら、必ず
grab_stop()メソッドを実行してください。
1.grab_start()メソッド
grab_start()メソッドが実行されると、カメラから取得した画像データが、順次、PC側のメモリへ転送されます。
2.read_frames()メソッド
PCのメモリに転送された画像データを取得するため、read_frames()メソッドを定期的に実行します。
ret, frames, count, frame_no = capture.read_frames(copy : bool = False)
|
引数
copy |
リングバッファから画像データをコピーして取得するかどうか。 コピーする :True コピーしない:False(初期値) |
戻り値
ret |
成功時:1 失敗時:0 データ上書き時:リングバッファのメモリが上書きされた画像枚数を負にした値 |
frames |
前回取得したフレームの次のフレームから現在取得したフレームまでの画像データをリストで取得します。 |
count |
前回取得したフレームの次のフレームから現在取得したフレームまでのフレーム数 |
frame_no |
grab_startから入力が完了した総フレーム数(1, 2, 3...) |
3.grab_stop()メソッド
最後に画像の取り込みを停止するため、grab_stop()メソッドを実行します。
◆転送先(PC側)のメモリ構造について
撮影した画像データは順次、PC側のメモリへ転送されますが、PC側のメモリは
リングバッファ構造になっています。
リングバッファは初期値で4フレーム分のメモリを確保しています。
以下、リングバッファが4フレーム分の時の例で説明します。
grab_start()メソッドが実行されると、カメラで撮影した画像データはリングバッファの先頭から順次格納されます。
撮影した画像のフレーム数がリングバッファのフレーム数に達すると、画像データはリングバッファの先頭の位置に格納されます。
下図の例では、撮影したフレーム番号(
frame_no)が
1、2、3、4と撮影し、フレーム番号が
5になると、リングバッファの先頭の位置(リングバッファの1番の位置)に画像データが格納されます。
以降、リングバッファの最後の位置に画像データが格納されると、次のフレーム画像は、リングバッファの先頭の位置に格納されるのを繰り返します。
read_frames()メソッドで取得した画像データのフレーム数(戻り値の
count)が、リングバッファのフレーム数を超えると取得した画像データは上書きが発生しています。
このとき、read_frames()メソッドの戻り値の
ret の値はマイナスとなり、
ret の値の絶対値が上書きが発生したフレーム数となります。
リングバッファの上書きが発生する場合、read_frames()メソッドを
read_frames(True)として画像データをリングバッファからコピーして取得するか、AcaPyクラスの
mem_numプロパティの値を大きくして、リングバッファのフレーム数を多くしてください。