相機丟幀筆記(減少程式耗時)
阿新 • • 發佈:2018-11-24
之前在相機資料回撥函式中採集資料時,由於在回撥中對資料進行處理,導致如何資料運算量非常大時,會出現丟幀。
通過MvTimer類對每個函式進行耗時測試:
- 0ms Mat image(pNewImage->head.iHeight, pNewImage->head.iWidth, CV_8UC1);
- 0ms memcpy(image.data, pNewImage->buffer, pNewImage->head.iHeight* pNewImage->head.iWidth);
- 3ms
- 3ms cvtColor(resImage, frame, CV_GRAY2BGR);
- 4ms cv::resize(frame, frame, cv::Size(640, 480));
- 0ms Mat imageROI = BIGframe(Rect(n*frame.cols, m*frame.rows, frame.cols, frame.rows));
- 0ms
- 17ms imshow("MainWindows", BIGframe);
這幾個函式耗時總計27ms,測試了函式首位總計耗時31ms。
從上面可以看出imshow函式耗時異常,通過分析發現imshow在顯示高解析度影象時,耗時特別多
於是:
將BIGframe的解析度由 640*18*480*4 resize為 Size(1800, 300) 此時 imshow函式耗時變為 0ms 。
cv::resize(BIGframe, BIGframe, Size(1800, 300));用預設的 resize 函式耗時 5ms 。
cv::resize(BIGframe, BIGframe0, Size(1800, 300), 0, 0, INTER_NEAREST);更改引數為最近領插值耗時 1ms 。該引數為耗時最小引數。
更改兩個resize函式的引數 和 在大解析度imshow函式的之前resize減小解析度再顯示之後,耗時總計變為11ms。
使用mindvision的demo顯示時,耗時為16m,所以比demo耗時更加少,說明程式耗時正常。
耗時減小為原來的 35.48% 。
程式顯示72張圖,顯示雷達的情況下,debug模式13ms,release模式只要7ms,時間僅僅為其53.85%。
識別部分耗時計算:
- 26ms std::vector<bbox_t> result_vec = detector.detect(frame); //Release下使用.................
- 0ms draw_boxes(frame, result_vec, obj_names, 0, -1, -1); //Release下使用.................
- 0ms object_location(frame, result_vec, ©Radar); //Release下使用.................
-
上圖分別為:release模式下,有識別和無識別情況下,資源佔用對比圖。