キーワードから探す

※スペースで区切って複数検索が可能です。

カテゴリで絞り込む

よく検索されるキーワード

ID:413
作成日: 2023/09/08

【AcaPy】連続画像取込(Grab)サンプルプログラム

カテゴリ AcaPy

画像を連続で取り込む場合は、以下のGrabサンプルプログラムをベースにお使いください。

◆Grabサンプルプログラム

import sys

import cv2      # OpenCV
import acapy    # AcaPy

# ----------------------------------------------------------------
# AcaPyクラスのインスタンス
capture = acapy.AcaPy()

if capture.is_opened is False:
    # 画像入力ボードが見つからないときは終了
    del capture
    print("Board or Camera not recognized.")
    sys.exit(0)

# iniファイル(ボード設定ファイル)の読込、AcapLib2のiniファイルと共通です。
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:

    # 前回取得した画像の次の画像から今回までの画像を取得
    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)にリストで格納されます。

下図の例では、フレーム番号の撮影中にread_frames()メソッドが呼ばれると、フレーム番号
画像が撮影完了するまで待ってから、前回、取得した画像データのフレームの画像(フレーム番号)から、今回、取得した画像データ(フレーム番号)のフレーム番号3、4、5の3枚分の画像データが戻り値(frames)に格納されます。

最後に、画像入力を停止する際は、grab_stop()メソッドを実行します。
grab_start()メソッドを実行したら、必ずgrab_stop()メソッドを実行してください。

AcaPy AcapLib2 Python Grab

1.grab_start()メソッド

grab_start()メソッドが実行されると、カメラから取得した画像データが、順次、PC側のメモリへ転送されます。
capture.grab_start()

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()メソッドを実行します。
capture.grab_stop()

◆転送先(PC側)のメモリ構造について

撮影した画像データは順次、PC側のメモリへ転送されますが、PC側のメモリはリングバッファ構造になっています。
リングバッファは初期値で4フレーム分のメモリを確保しています。

以下、リングバッファが4フレーム分の時の例で説明します。

grab_start()メソッドが実行されると、カメラで撮影した画像データはリングバッファの先頭から順次格納されます。
撮影した画像のフレーム数がリングバッファのフレーム数に達すると、画像データはリングバッファの先頭の位置に格納されます。

下図の例では、撮影したフレーム番号(frame_no)が1、2、3、4と撮影し、フレーム番号がになると、リングバッファの先頭の位置(リングバッファの1番の位置)に画像データが格納されます。
以降、リングバッファの最後の位置に画像データが格納されると、次のフレーム画像は、リングバッファの先頭の位置に格納されるのを繰り返します。

AcaPy AcapLib2 Python Grab
read_frames()メソッドで取得した画像データのフレーム数(戻り値のcount)が、リングバッファのフレーム数を超えると取得した画像データは上書きが発生しています。
このとき、read_frames()メソッドの戻り値の ret の値はマイナスとなり、ret の値の絶対値が上書きが発生したフレーム数となります。

リングバッファの上書きが発生する場合、read_frames()メソッドをread_frames(True)として画像データをリングバッファからコピーして取得するか、AcaPyクラスのmem_numプロパティの値を大きくして、リングバッファのフレーム数を多くしてください。
この内容は参考になりましたか?
ご回答いただきまして、ありがとうございます。
今後の参考にさせていただきます。
ご意見・ご感想、ありがとうございます。

関連するご質問

Now Loading...

Now Loading...