1. 程式人生 > >相機丟幀筆記(減少程式耗時)

相機丟幀筆記(減少程式耗時)

之前在相機資料回撥函式中採集資料時,由於在回撥中對資料進行處理,導致如何資料運算量非常大時,會出現丟幀。

通過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    
     flip(image, resImage, -1);  //水平垂直翻轉
  • 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  
      frame.copyTo(imageROI);
  • 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, &copyRadar);                        //Release下使用.................
  • 有識別

  • 上圖分別為:release模式下,有識別和無識別情況下,資源佔用對比圖。