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

最佳實踐#

本章總結了經實證有效的建議,用以在生產環境中建置穩健、高效且易於維護的 pypylon 應用程式。

資源管理#

請務必確保以正確的方式取得並釋放相機資源。

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

優點:

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

設備識別#

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

devices[0]

請改用唯一識別碼:

  • 序號
  • 使用者自訂名稱

詳情請參閱「如何挑選相機」。

效能最佳化#

採用適當的抓取策略#

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

在源頭減少資料量#

  • 指定一個ROI。
  • 降低解析度。
  • 若可行,請降低幀率。

避免不必要的複製#

  • 僅在必要時複製。
  • 在可能的情況下,請重複使用緩衝區。

線程設計#

分別進行採集與處理#

Camera → Queue → Processing

優點:

  • 更好的 CPU 利用率
  • 避免阻礙資料擷取

使用生產者-消費者模式#

  • 「收購」討論串會推送圖片。
  • 處理執行緒會消耗它們。

使用線程安全的佇列#

import queue
q = queue.Queue()

多階段管線#

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

Grab → Preprocess → Analyze → Output

指引:

  • 每個階段都有一項職責。
  • 透過佇列進行通訊。
  • 允許各階段獨立調整比例。

錯誤處理#

請務必確認「Grab」是否成功#

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 執行緒與工作執行緒混合使用

心智模型#

Reliable system = correct architecture + error handling + performance tuning

重點摘要#

  • 從一開始就以堅固耐用為設計原則。
  • 區分不同的考量(收購與處理)。
  • 驗證每一次外部互動。
  • 制定應對失敗與復原的計畫。