我的应用程序使用Opencv gpu类gpu::FarnebackOpticalFlow来计算输入视频的一对连续帧之间的光流.为了加快这个过程,我利用OpenCV的TBB支持在多线程中运行该方法.但是,多线程性能的行为与单线程性能不同.只是为了让您了解不同的行为,这里有两个快照,分别是单线程和多线程实现.
多线程实现假设将图像分成8个不同的条带(我的pc上的核心数),并且每个应用光流的Farneback实现的gpu方法.以下是两种方法的相应代码行:
单线程实现
/* main.cpp */
//prevImg and img are the input Mat images extracted from the input video
...
GpuMat gpuImg8U(img);
GpuMat gpuPrevImg8U(prevImg);
GpuMat u_flow, v_flow;
gpu::FarnebackOpticalFlow farneback_flow;
farneback_flow.numLevels = maxLayer;
farneback_flow.pyrScale = 0.5;
farneback_flow.winSize = windows_size;
farneback_flow.numIters = of_iterations;
farneback_flow(gpuPrevImg8U,gpuImg8U,u_flow,v_flow);
getFlowField(Mat(u_flow),Mat(v_flow),optical_flow);
...
}
void getFlowField(const Mat& u, const Mat& v, Mat& flowField){
for (int i = 0; i < flowField.rows; ++i){
const float* ptr_u = u.ptr<float>(i);
const float* ptr_v = v.ptr<float>(i);
Point2f* row = flowField.ptr<Point2f>(i); …Run Code Online (Sandbox Code Playgroud)