多核,从内部函数调用函数在第二个核上运行。 directshow,opencv

时间:2013-05-13 11:36:18

标签: c++ multithreading opencv directshow multicore

所以,我一直在用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”调用)?

谢谢!

2 个答案:

答案 0 :(得分:1)

您的问题不是很明确,但我想您想在另一个帖子中调用sampleCallbackFunction。 (函数通常在另一个函数内部调用,这使得调用堆栈......)

因为DirectShow,您的sampleCallBackFunction很可能已经在与主线程不同的流线程上运行。当然,流线程中发生的所有事情都是一个逻辑核心的负担。

然后,如果您在sampleCallbackFunction创建另一个线程,那么您的系统足够聪明,可以在可用内核上分配工作,这不是问题。但是我怀疑parallel_invoke是否允许你灵活地做你必须做的事情,如果你真的想在那里建立另一个工人,我建议寻找CreateThread

BTW:在GUI应用程序中,在另一个线程中调用函数的最简单方法是使用SendMessage,因为调用总是分配给创建窗口的线程。尽管如此,这一呼吁仍在阻止......

答案 1 :(得分:1)

首先,您可能希望在没有处理的情况下更好地检查CPU过热到底是多少50%。最有可能的是,您可以通过在另一个像素格式域中处理视频来避免转换为RGB色彩空间。裸视频捕获不需要高CPU使用率。

  

如何从另一个函数内部调用函数(“sampleCallBackFunction”从“startDirectshow”调用)?

如果您想要并行处理和/或在处理数据时继续捕获,那么这并不是您想要做的事情。 startDirectshow线程是一个控制线程,它启动/停止处理并启动内部流线程。与控制线程同步将不会提高性能,但会带来(a)同步开销和(b)终止死锁的可能性。(/ p>

如果要并行处理,则需要在示例抓取器回调中复制数据并尽快退出回调。然后,一个线程池(例如TPL或您自己的线程)将异步处理,而不会影响捕获性能。