相关疑难解决方法(0)

OpenCV GPU Farneback Optical Flow在多线程中非常有效

我的应用程序使用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)

c++ multithreading opencv gpu opticalflow

6
推荐指数
1
解决办法
1770
查看次数

标签 统计

c++ ×1

gpu ×1

multithreading ×1

opencv ×1

opticalflow ×1