所以,我一直在用opencv开发实时跟踪系统。几天前我不得不开始使用directshow(这对我来说是全新的),因为我需要更高的网络摄像头分辨率。分辨率越高,CPU使用率越高。当只使用没有任何opencv算法的directshow时,cpu的运行率为50%。 (我有双核= 100%使用一个核心)
所以现在我需要扩展这个系统,以便使用我的两个核心。
我从微软发现了这个很好的例子并且能够使用我的两个核心运行它:
void test1(){
parallel_invoke(
[]() { run1(); },
[]() { run2(); }
);
}
这完全运行,我能够使用总cpu的大约85%(只有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”调用)?
谢谢!
答案 0 :(得分:1)
您的问题不是很明确,但我想您想在另一个帖子中调用sampleCallbackFunction
。 (函数通常在另一个函数内部调用,这使得调用堆栈......)
因为DirectShow,您的sampleCallBackFunction
很可能已经在与主线程不同的流线程上运行。当然,流线程中发生的所有事情都是一个逻辑核心的负担。
然后,如果您在sampleCallbackFunction
创建另一个线程,那么您的系统足够聪明,可以在可用内核上分配工作,这不是问题。但是我怀疑parallel_invoke
是否允许你灵活地做你必须做的事情,如果你真的想在那里建立另一个工人,我建议寻找CreateThread
。
SendMessage
,因为调用总是分配给创建窗口的线程。尽管如此,这一呼吁仍在阻止......
答案 1 :(得分:1)
首先,您可能希望在没有处理的情况下更好地检查CPU过热到底是多少50%。最有可能的是,您可以通过在另一个像素格式域中处理视频来避免转换为RGB色彩空间。裸视频捕获不需要高CPU使用率。
如何从另一个函数内部调用函数(“sampleCallBackFunction”从“startDirectshow”调用)?
如果您想要并行处理和/或在处理数据时继续捕获,那么这并不是您想要做的事情。 startDirectshow
线程是一个控制线程,它启动/停止处理并启动内部流线程。与控制线程同步将不会提高性能,但会带来(a)同步开销和(b)终止死锁的可能性。(/ p>
如果要并行处理,则需要在示例抓取器回调中复制数据并尽快退出回调。然后,一个线程池(例如TPL
或您自己的线程)将异步处理,而不会影响捕获性能。