こちらの資料を読んでください。
コードの全体説明
このコードは、カメラから画像データを取得するためのコールバック関数をクラス内に定義し、そのクラスを使用して画像データを取得する方法を示しています。具体的には以下の手順を実行します:
- StApiの初期化
- カメラへの接続
- コールバッククラスの登録と使用
- コールバック関数を通じた画像データの取得
クラス CMyCallback
の定義
class CMyCallback:
"""
Class that contains a callback function.
"""
def datastream_callback(self, handle=None, context=None):
"""
Callback to handle events from DataStream.
:param handle: handle that trigger the callback.
:param context: user data passed on during callback registration.
"""
st_datastream = handle.module
if st_datastream:
with st_datastream.retrieve_buffer() as st_buffer:
# Check if the acquired data contains image data.
if st_buffer.info.is_image_present:
# Create an image object.
st_image = st_buffer.get_image()
# Display the information of the acquired image data.
print("BlockID={0} Size={1} x {2} First Byte={3}".format(
st_buffer.info.frame_id,
st_image.width, st_image.height,
st_image.get_image_data()[0]))
else:
# If the acquired data contains no image data.
print("Image data does not exist.")
CMyCallback
クラス
- 画像データの取得に使用するコールバック関数を含むクラスです。
- メソッド
datastream_callback
がデータストリームのイベントを処理し、画像データを表示します。
メイン部分
if __name__ == "__main__":
# Get the callback function:
my_callback = CMyCallback()
cb_func = my_callback.datastream_callback
try:
# Initialize StApi before using.
st.initialize()
# Create a system object for device scan and connection.
st_system = st.create_system()
# Connect to first detected device.
st_device = st_system.create_first_device()
# Display DisplayName of the device.
print('Device=', st_device.info.display_name)
# Create a datastream object for handling image stream data.
st_datastream = st_device.create_datastream()
# Register callback for datastream
callback = st_datastream.register_callback(cb_func)
# Start the image acquisition of the host (local machine) side.
st_datastream.start_acquisition()
# Start the image acquisition of the camera side.
st_device.acquisition_start()
# Press enter to terminate.
input("Press enter to terminate")
# Stop the image acquisition of the camera side
st_device.acquisition_stop()
# Stop the image acquisition of the host side
st_datastream.stop_acquisition()
except Exception as exception:
print(exception)
主な処理
-
コールバッククラスのインスタンス作成:
my_callback = CMyCallback() cb_func = my_callback.datastream_callback
-
CMyCallback
のインスタンスを作成し、そのコールバック関数を取得します。
-
-
StApiの初期化:
st.initialize() st_system = st.create_system() st_device = st_system.create_first_device() print('Device=', st_device.info.display_name)
- StApiを初期化し、最初に検出されたデバイスに接続します。
-
データストリームの作成とコールバック登録:
st_datastream = st_device.create_datastream() callback = st_datastream.register_callback(cb_func)
- データストリームオブジェクトを作成し、コールバック関数を登録します。
-
画像取得の開始と停止:
st_datastream.start_acquisition() st_device.acquisition_start() input("Press enter to terminate") st_device.acquisition_stop() st_datastream.stop_acquisition()
- デバイスとホストで画像取得を開始し、ユーザーがEnterキーを押すまで待機してから取得を停止します。
クラスにコールバックを使用する理由とメリット
理由
-
構造の整理:
- コールバック関数をクラス内に配置することで、コードがよりモジュール化され、可読性が向上します。
-
状態管理:
- クラスはインスタンス変数を持つことができるため、コールバック関数が必要とする状態情報を簡単に管理できます。
-
再利用性:
- クラスを再利用しやすくなり、異なるコンテキストで同じコールバックロジックを使用することができます。
メリット
-
柔軟性:
- クラスメソッドとしてコールバックを定義することで、追加の機能やロジックを簡単に追加できます。
-
スケーラビリティ:
- 複雑な処理や複数のコールバックを管理する場合に、クラスを使用することでコードの管理が容易になります。
-
コードの再利用性:
- 同じコールバッククラスを他のプロジェクトや異なる部分で使用でき、コードの重複を避けられます。
このアプローチにより、コードの整理がしやすく、複雑なシステムに対しても対応可能な柔軟性を持つことができます。
関連資料