最佳實踐#
資源管理#
請務必確保以正確的方式取得並釋放相機資源。
優點:
- 自動清理
- 例外安全
- 防止資源洩漏
設備識別#
切勿依賴裝置索引,因為它們並不穩定:
請改用唯一識別碼:
- 序號
- 使用者自訂名稱
詳情請參閱「如何挑選相機」。
效能最佳化#
採用適當的抓取策略#
LatestImageOnly→ 低延遲OneByOne→ 完成處理
在源頭減少資料量#
- 指定一個ROI。
- 降低解析度。
- 若可行,請降低幀率。
避免不必要的複製#
- 僅在必要時複製。
- 在可能的情況下,請重複使用緩衝區。
線程設計#
分別進行採集與處理#
優點:
- 更好的 CPU 利用率
- 避免阻礙資料擷取
使用生產者-消費者模式#
- 「收購」討論串會推送圖片。
- 處理執行緒會消耗它們。
使用線程安全的佇列#
多階段管線#
將複雜的應用程式架構化為管線:
指引:
- 每個階段都有一項職責。
- 透過佇列進行通訊。
- 允許各階段獨立調整比例。
錯誤處理#
請務必確認「Grab」是否成功#
if grab_result.GrabSucceeded():
process(grab_result.Array)
else:
log_error(grab_result.ErrorDescription)
擷取與記錄例外狀況#
實作復原邏輯#
關機策略#
實作乾淨關機機制:
- 使用
threading.Event. - 請避免阻擋沒有超時設定的來電。
- 明確地停止擷取。
OpenCV 整合規則#
- 執行
imshow()僅在主執行緒中。 - 請避免在工作執行緒中使用 GUI。
系統監控#
追蹤關鍵指標:
- 幀率
- 處理延遲
- 佇列大小
- CPU 使用率
配置管理#
- 將相機參數儲存於外部。
- 請避免使用硬編碼的數值。
- 在啟動時驗證設定。
測試建議#
- 使用真實硬體進行測試。
- 模擬載荷條件。
- 驗證還原行為。
常見陷阱#
- 在釋放後使用影像緩衝區
- 無限期阻塞佇列
- 忽略同步要求
- 將 UI 執行緒與工作執行緒混合使用
心智模型#
重點摘要#
- 從一開始就以堅固耐用為設計原則。
- 區分不同的考量(收購與處理)。
- 驗證每一次外部互動。
- 制定應對失敗與復原的計畫。