所以,我一直在用 opencv 开发一个实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要来自网络摄像头的更高分辨率。分辨率越高,CPU 使用率越高。当仅使用没有任何 opencv 算法的 directshow 时,cpu 以 50% 的速度运行。(我有双核 = 100% 使用一个核心)
所以现在我需要扩展这个系统,以便使用我的两个核心。
我从微软找到了这个很好的例子,并且能够使用我的两个内核运行它:
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()”中,并将布尔值“newFrameAvailable”设置为 true。并让另一个线程从全局数组中提取数据。
while(true)
If (newFrameAvailable){
get-next-frame-in-buffer-and-do-opencv-algorithm();
}
else{
do-nothing();
}
}
所以。我的问题:如何从另一个函数内部调用一个函数(从“startDirectshow”调用“sampleCallBackFunction”)?
谢谢!