ベストプラクティス#
リソース管理#
カメラリソースが適切に取得および解放されるように常に確認してください。
メリット:
- 自動クリーンアップ
- 例外安全性
- リソースリークの防止
デバイスの識別#
デバイスインデックスは固定されないため、決して依存しないでください:
代わりに一意の識別子を使用してください:
- シリアル番号
- ユーザー定義名
詳細については、Discovering and Selecting a Cameraを参照してください。
パフォーマンスの最適化#
適切なグラブ戦略の使用#
LatestImageOnly→ 低遅延OneByOne→ 完全な処理
ソースでのデータ削減#
- ROIを指定します。
- 解像度を下げる。
- 可能であればフレームレートを下げます。
不要なコピーの回避#
- 必要な場合にのみコピーします。
- 可能な場合はバッファを再利用します。
スレッディング設計#
取り込みと処理の分離#
メリット:
- 優れたCPU使用率
- 取り込みのブロックを回避します
プロデューサー・コンシューマーパターンの使用#
- 取り込みスレッドが画像をプッシュします。
- 処理スレッドがそれらをコンシューマーとして処理します。
スレッドセーフなキューの使用#
マルチステージパイプライン#
複雑なアプリケーションをパイプラインとして構築します。
ガイドライン:
- 各ステージには1つの責任があります。
- キューを介して通信します。
- ステージごとに独立した Scaling を許可します。
エラーハンドリング#
グラブの成功を必ず確認する#
if grab_result.GrabSucceeded():
process(grab_result.Array)
else:
log_error(grab_result.ErrorDescription)
例外のキャッチとログ記録#
リカバリロジックの実装#
シャットダウン戦略#
クリーンなシャットダウンメカニズムの実装:
- 使用
threading.Event. - タイムアウトなしのブロック呼び出しを避ける。
- 明示的にアクイジションを停止する。
OpenCV統合ルール#
- [Run]をクリックします
imshow()メインスレッドでのみ実行されます。 - ワーカースレッドでのGUIの使用を避ける。
システム監視#
主要なメトリクスの追跡:
- フレームレート
- 処理レイテンシ
- キューサイズ
- CPU使用率
構成管理#
- カメラパラメータを外部に保存する。
- ハードコードされた値を避ける。
- 起動時に設定を検証する。
テストに関する推奨事項#
- 実機でテストする。
- 負荷条件をシミュレートする。
- リカバリ動作を検証する。
よくある落とし穴#
- 解放後のイメージバッファの使用
- 無制限のキューのブロック
- 同期要件の無視
- UIスレッドとワーカースレッドの混在
メンタルモデル#
主なポイント#
- 最初から堅牢性を考慮した設計を行う。
- 処理と買収の分離
- すべての外部インタラクションの検証
- 障害とリカバリの計画