現象
OpenCV 檢測隧道車輛,保存圖像時畫面卡頓(「卡圖」)。
原因分析
- 主線程同步寫磁盤:`cv::imwrite` 耗時較長(壓縮編碼 + IO),阻塞消息泵,導致界面無法重繪、響應。
- 內存分配/拷貝:大圖 `Mat` 拷貝、轉換格式消耗 CPU。
- 殺毒軟件掃描:新生成文件觸發實時掃描進一步延遲。
解決方案
方案一:異步保存線程池(推薦)
// 全局線程池
std::thread saveThread([img = frame.clone(), path]() {
cv::imwrite(path, img);
});
saveThread.detach(); // 或放入任務隊列
方案二:預分配緩衝區 + 異步 IO
- 預分配 `std::vector` 編碼緩衝區,避免重複分配。
- Windows 使用 `WriteFile` + `FILE_FLAG_OVERLAPPED` 異步寫入。
方案三:降低保存頻率/質量
- 僅保存關鍵幀(檢測到目標時)。
- 調低 JPEG 品質參數:`cv::imwrite(path, img, {cv::IMWRITE_JPEG_QUALITY, 70});`
驗證方法
在保存調用前後加 `QueryPerformanceCounter` 計時,若 > 16ms (60FPS 幀間隔) 則必須異步化。