跳至內容
測試伺服器
開發伺服器

最佳實務#

本章總結了在生產環境中建構強固、高效且可維護的 pypylon 應用程式的經驗證建議。

資源管理#

務必確保正確取得與釋放相機資源。

with pylon.InstantCamera(pylon.FirstFound) as camera:
    # use camera

優點:

  • 自動清除
  • 例外安全性
  • 防止資源洩漏

裝置識別#

切勿依賴裝置索引,因為它們並不穩定:

devices[0]

請改用唯一識別碼:

  • 序號
  • 使用者自訂名稱

請參閱 Discovering and Selecting a Camera 以了解詳細資訊。

效能最佳化#

使用適當的 Grab Strategy#

  • LatestImageOnly → 低延遲
  • OneByOne → 完整處理

在來源處減少資料#

  • 指定 ROI。
  • 降低解析度。
  • 如果可能,請降低影格率。

避免不必要的複製#

  • 僅在需要時複製。
  • 可能時重複使用緩衝區。

執行緒設計#

分離擷取與處理#

Camera → Queue → Processing

優點:

  • 更好的 CPU 利用率
  • 避免阻塞擷取

使用 Producer-Consumer Pattern#

  • 擷取執行緒推送影像。
  • 處理執行緒消耗影像。

使用執行緒安全佇列#

import queue
q = queue.Queue()

多階段管線#

將複雜的應用程式架構化為管線:

Grab → Preprocess → Analyze → Output

指導原則:

  • 每個階段負擔一項職責。
  • 透過佇列進行通訊。
  • 允許每個階段進行獨立的 Scaling。

錯誤處理#

務必檢查擷取成功狀態#

if grab_result.GrabSucceeded():
    process(grab_result.Array)
else:
    log_error(grab_result.ErrorDescription)

擷取並記錄例外狀況#

try:
    # acquisition code
    pass
except Exception as e:
    log_error(e)

實作復原邏輯#

Error → StopGrabbing → Retry → Continue

關閉策略#

實作清單關閉機制:

  • 使用 threading.Event.
  • 避免沒有逾時設定的阻塞呼叫。
  • 明確停止擷取。
stop_event.set()
camera.StopGrabbing()

OpenCV 整合規則#

  • 執行 imshow() 僅限主執行緒。
  • 避免在背景執行緒中使用 GUI。

系統監控#

追蹤關鍵指標:

  • 影格率
  • 處理延遲
  • 佇列大小
  • CPU 使用率

組態管理#

  • 在外部儲存相機參數。
  • 避免硬編碼值。
  • 在啟動時驗證組態。

測試建議#

  • 使用實際硬體進行測試。
  • 模擬負載狀況。
  • 驗證復原行為。

常見陷阱#

  • 在釋放後使用影像緩衝區
  • 無限期封鎖佇列
  • 忽略同步要求
  • 混用 UI 與背景執行緒

Mental Model#

Reliable system = correct architecture + error handling + performance tuning

重點整理#

  • 從一開始就以強固性為目標進行設計。
  • 分離關注點(擷取與處理)。
  • 驗證每個外部互動。
  • 為失敗與復原做好規劃。