【发布时间】:2013-05-13 11:36:18
【问题描述】:
所以,我一直在使用 opencv 开发一个实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要来自网络摄像头的更高分辨率。分辨率越高,CPU 使用率越高。当只使用没有任何 opencv 算法的 directshow 时,cpu 以 50% 的速度运行。 (我有双核 = 100% 使用一个核)
所以现在我需要扩展这个系统,以便使用我的两个内核。
我从 microsoft 找到了这个很好的示例,并且能够使用我的两个内核运行它:
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”)?
谢谢!
【问题讨论】:
标签: c++ multithreading opencv directshow multicore