所以,我一直在用opencv開發一個實時跟蹤系統。幾天前,我不得不開始使用directshow(這對我來說是全新的),因爲我需要從網絡攝像頭獲得更高的分辨率。分辨率越高,CPU使用率越高。當僅使用directshow而沒有使用任何opencv算法時,cpu運行在50%。 (我有雙核心= 100%使用一個核心)多核,使從內部函數調用的函數在第二個核上運行。 directshow,opencv
所以現在我需要擴展這個系統,以便使用我的兩個核心。
我發現從微軟這個很好的例子,並能夠運行它,用我的兩個核心:
void test1(){
parallel_invoke(
[]() { run1(); },
[]() { run2(); }
);
}
這完美運行,並且我能使用約85%的總CPU(帶剛2個函數與循環的東西)。 現在我想在我的其他系統中使用它。我不知道該怎麼做。
我的系統的簡短說明:
int main(){
startDirectshow()
};
startDirectShow(){
//code for creating the directshow filter graph. including iSampleGrabber filter.
}
sampleCallBackFunction(....){
// function called for every frame in the graph
}
每一件事情是工作,到目前爲止,該sampleCB被每幀(或者以每秒至少多幀,幀可能會使用這個時候錯過?!)
我的想法是讓「sampleCallBackFunction()」在第二個內核上運行(我不想將其鎖定到特定內核,只使用第一個可用的)
但這個例子,我發現開始兩者的功能同一時間,從同一個地方。是否有可能以某種方式告訴系統「sampleCallBackFucntion」應該在另一個核心上運行?
我的另一個想法是將數據存儲在「sampleCallBackFunction()」中,並且還將bool「newFrameAvailable」設置爲true。讓另一個線程從全局數組中提取數據。
while(true)
If (newFrameAvailable){
get-next-frame-in-buffer-and-do-opencv-algorithm();
}
else{
do-nothing();
}
}
所以。我的問題:如何從另一個函數內調用函數(「sampleCallBackFunction」從「startDirectshow」調用)?
謝謝!
感謝您的回答。你是對的,我想爲samplerCallbackFunction創建一個使用另一個cpu-core的新線程。但我想知道,如果我的系統應該通過可用內核分配負載,爲什麼我無法將CPU使用率提高到50%以上?第二個核心運行的是~4%,而我的軟件需要moooore cpu power:D(我的視頻輸出很差) – Easyrider 2013-05-13 12:33:54
要利用資源,必須先創建工作線程。在這種情況下,您的主線程(大部分)處於空閒狀態(僅管理過濾器圖),而流線程正在從相機中獲取幀。單線程不能使用多於一個邏輯核心。 – Vaaksiainen 2013-05-13 12:39:12
我看了一下「資源監視器」,發現我的軟件有7個線程處於活動狀態。而且我也看到有幾次它使用了52%的CPU。這意味着一切都已經在多核上運行,我不需要關心這個?! – Easyrider 2013-05-13 13:02:34