Basic Tutorial
このチュートリアルでは、N10-W02 ライブラリの基本的な考え方と利用方法を説明します。
このライブラリは Canon N10-W02 を Python から簡単に扱うことを目的としています。
Philosophy
一般的に N10-W02 を利用するには、
ORiN2 SDK
COM
Canon Provider
Windows 固有 API
などを理解する必要があります。
しかし、多くのアプリケーション開発者に必要なのは
「画像を取得する」
だけです。
そこで本ライブラリでは
Application
│
▼
N10W02Ctrl
│
ORiN2 / COM
│
Canon N10-W02
という構造を採用しています。
アプリケーションは ORiN2 を一切意識する必要がありません。
Remote First
N10-W02 はネットワークカメラです。
そのため、このライブラリでは
ローカル制御
ではなく
リモート制御
を基本思想にしています。
Ethernet
Client ---------------- Server
│
N10W02Ctrl
│
ORiN2 COM
│
Camera
画像取得も通常の RPC として扱われます。
client.capture_bmp_bytes()
↓
server
↓
N10W02Ctrl.capture_bmp_bytes()
↓
BMP bytes
画像転送のための特殊なストリーミングサーバーは必要ありません。
BMP バイナリを通常の gRPC メッセージとして送受信します。
Dynamic RPC
通常の gRPC では
proto を編集
stub を生成
wrapper を作成
という作業が必要になります。
本ライブラリでは grpc_frame を利用することで
N10W02Ctrl
↓
そのまま公開
↓
Clientからそのまま呼び出す
という構成になっています。
つまり
サーバー側にメソッドを追加すると、 クライアント側でも同じ名前で利用できます。
クライアント用 API を再実装する必要はありません。
Local Usage
ローカル PC 上で直接利用する場合は
from n10w02 import N10W02Ctrl
camera = N10W02Ctrl(
camera_ip="10.170.10.42",
)
image = camera.capture_bmp_bytes()
with open("capture.bmp", "wb") as f:
f.write(image)
これだけで画像を取得できます。
gRPC Server
サーバーは数行で起動できます。
from n10w02.grpc_server import n10w02_grpc_server
n10w02_grpc_server(
camera_ip="10.170.10.42",
grpc_host="0.0.0.0",
grpc_port=50051,
)
サーバー内部では
COM 初期化
ORiN2 接続
Camera Provider 接続
を自動で実行します。
Remote Client
別 PC から利用する場合は
from n10w02.grpc_client import N10W02GrpcClient
client = N10W02GrpcClient(
server_ip="10.170.10.38",
grpc_port=50051,
)
image = client.capture_bmp_bytes()
ローカル API とほぼ同じ感覚で利用できます。
Why BMP?
本ライブラリでは JPEG ではなく BMP を基本形式としています。
理由は
カメラの生データを保持できる
圧縮処理が不要
OpenCV 等へそのまま渡せる
画像品質が変化しない
ためです。
必要に応じて利用側で JPEG や PNG へ変換してください。
Error Handling
接続処理はコンストラクタで実行されます。
camera = N10W02Ctrl(...)
接続できない場合は例外が送出されます。
これは
接続できない状態でオブジェクトだけ存在する
ことを避けるためです。
アプリケーションは起動時に接続確認が完了した状態になります。
Logging
ライブラリ全体は x_logger を前提に設計されています。
各処理では
接続開始
接続完了
COM 初期化
Provider 接続
画像取得
切断
などのログを出力します。
そのため、障害解析も容易になっています。
Summary
このライブラリの特徴は以下の通りです。
ORiN2 を隠蔽する
Python オブジェクトをそのまま公開する
gRPC の API を手作業で実装しない
ローカル・リモートで同じ API を利用できる
画像を通常の RPC として転送する
シンプルな構成でアプリケーションを作成できる
アプリケーション開発者は ORiN2 や COM の詳細を意識することなく、通常の Python ライブラリと同じ感覚で N10-W02 を利用できます。
作者
Kengo NAKADA (kengo.nakada@gmail.com)