2015-06-10 155 views
3

我正在寫一個代碼,使用QTimer觸發opencv videoCapture調用來讀取視頻幀。我通常會閱讀大量的視頻,所以想知道是否有其他方法可以加速這一過程。qtimer和opencv運行緩慢

這裏我的代碼的快照使用QTimer:

timer = new QTimer(); 
timer->setTimerType(Qt::PreciseTimer); 
connect(timer, SIGNAL(timeout()), this, SLOT(read_shape_params())); 

//in a loop stop timer and setup the next video stream then start 

void next(){ 

    timer->stop(); 

    stream = new video_stream_reader(); 
    stream->setColorGray(grayImage); 
    stream->set_begin_end(begin_at,end_at); 
    stream->open(video_base_path+video_path); 

    timer->start(0); 
} 

void shape_param_finder::read_shape_params(){ 
    Mat frame; 
    frame = stream->read_frame(); 
} 

Mat video_stream_reader::read_frame(){ 
    Mat frame; 
    bool bSuccess = capture->read(frame); 
    return frame; 

} 
+0

我真的不明白你想達到什麼目的,計時器運行速度是否太慢? – GPPK

+0

是的,確切地說。 QTimer很慢 –

+0

這可能是因爲你正在創建一個新的計時器對象。只需在循環前創建一個 – GPPK

回答

1

它有什麼與QTimer。但是

timer->start(0);

是一個問題。 您的視頻,你輸入相機有一個frame per second,這意味着一段時間產生幀。例如,25fps意味着您將在每個時間段獲得一個新幀,在這種情況下爲40ms

簡短的回答: 沒有合適的硬件同步,設置定時器超時1000/expected fps

龍答:

timeout = 0計時器會以最快的速度安排read_shape_params作爲該框架可以。這意味着性能瓶頸最終爲capture->read(frame);,假設代碼的其他部分(顯示器等)完美工作。

有3個病例的capture->read(frame)

  1. 它需要更多的時間,該決議時間:你不能做任何事情。它會很慢。
  2. 這是完全一樣的時間。這是最好的地方。這也不太可能。
  3. 那個時間段的分辨率需要的時間更少:應該是正確的?錯誤。您多次閱讀相同的圖像。這意味着最好你浪費CPU資源。在最壞的情況下,從你的觀點來看,情況1開始表現得像情況1。那個怎麼樣?假設它需要30毫秒來呈現一個幀(讀取和顯示,我假設你是線性的)。

    Read 1 : 30 ms, frame 1 
    Read 2 : 30 ms, frame 1 // wasted read, the other party has not updated the frame yet 
    Read 3 : 30 ms, frame 2 // your second frame has 60 ms latency, not 40 ms 
    Read 4 : 30 ms, frame 3 // frame 3 has 120 ms latency, sweet spot. 
    Read 5 : 30 ms, frame 3 // wasted read 
    Read 6 : 30 ms, frame 4 // frame 3 has 120 ms latency, sweet spot. 
    

如果最重要的是你保持排隊的項目用於顯示,顯示速度很慢,你認爲FPS會更低。

  • 您需要基準 video_stream_reader::read_frame執行時間是肯定的。
  • 您還需要基準哪個代碼負責顯示 圖像。我懷疑那裏存在瓶頸。