2011-05-26 114 views
2

我正在使用Qt和OpenCV。我使用QtOpenGL Widgets並將opencv框架映射爲glPlane上的紋理,這非常快速且效果很好。使用Qt並行化OpenCV處理

現在我想知道是否可以通過使用QThreads來提高性能。 QThread具有實現的映射和減少功能。因此,應該可以分割opencv幀並讓多個線程處理這些幀。

作爲示例:如果我的框架是640x480,並且我有4個可用的線程,我會將框架拆分爲640x120大小的框架並向每個線程傳遞一個框架。

線程沒有共享數據,因爲每個線程都得到它自己的幀,最後我只需要追加4幀或將它們複製到一個新的幀中。

我的問題是,你認爲這會起作用,它會給我一個提升處理或其他地方是否存在瓶頸?

回答

1

首先,我的直覺是說:「如果它真的很快,效果很好,不要改變它!」

如果你只是想玩弄線程,我建議你看看QtConcurrent。我不知道QThreadQtConcurrent之間的性能差異,但我更喜歡使用QtConcurrent::run而不是使用線程(我沒有性能關鍵的渲染代碼)。

1

首先,確保您不爲每一幀創建新線程 - 構建線程很昂貴。一個輕量級的解決方案可以使用QtConcurrent::run()創建N QFutures。對每個期貨使用QFuture::waitForFinished並收集結果。但是,我不相信QFutures是實時處理的正確解決方案。另一種方法是直接使用QThreadPool。再次確保你不要每一幀創建一個池。