gpt4 book ai didi

c++ - 加速 OpticalFlow 算法 - OpenCV

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:38 25 4
gpt4 key购买 nike

我正在从事一个使用光流算法估计无人机位置的项目。为此,我目前正在使用 cv::calcOpticalFlowFarneback
我的硬件是一个 Odroid U3,它最终将连接到无人机飞行 Controller 。

问题是这种方法对于这个硬件来说真的很重,我正在寻找其他一些方法来优化/加速它。

我已经尝试过的事情:

  • 将分辨率降低到 320x240 甚至 160x120。
  • 使用 OpenCV TBB(使用 WITH_TBB=ON BUILD_TBB=ON 并添加 -ltbb 进行编译)。
  • 按照 here 的建议更改光流参数

添加我的代码的相关部分:

int opticalFlow(){

// capture from camera
VideoCapture cap(0);
if( !cap.isOpened() )
return -1;

// Set Resolution - The Default Resolution Is 640 x 480
cap.set(CV_CAP_PROP_FRAME_WIDTH,WIDTH_RES);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,HEIGHT_RES);

Mat flow, cflow, undistortFrame, processedFrame, origFrame, croppedFrame;
UMat gray, prevgray, uflow;

currLocation.x = 0;
currLocation.y = 0;

// for each frame calculate optical flow
for(;;)
{
// take out frame- still distorted
cap >> origFrame;

// Convert to gray
cvtColor(origFrame, processedFrame, COLOR_BGR2GRAY);

// rotate image - perspective transformation
rotateImage(processedFrame, gray, eulerFromSensors.roll, eulerFromSensors.pitch, 0, 0, 0, 1, cameraMatrix.at<double>(0,0),
cameraMatrix.at<double>(0,2),cameraMatrix.at<double>(1,2));

if( !prevgray.empty() )
{
// calculate flow
calcOpticalFlowFarneback(prevgray, gray, uflow, 0.5, 3, 10, 3, 3, 1.2, 0);
uflow.copyTo(flow);

// get average
calcAvgOpticalFlow(flow, 16, corners);

/*
Some other calculations
.
.
.
Updating currLocation struct
*/
}
//break conditions
if(waitKey(1)>=0)
break;
if(end_run)
break;
std::swap(prevgray, gray);
}
return 0;
}

注意事项:

  • 我已经运行了 callgrind,瓶颈正如预期的那样是 calcOpticalFlowFarneback 函数。
  • 我在运行程序时检查了 CPU 核心负载,它并没有大量使用所有 4 个核心,在给定时间只有一个核心处于 100%(即使使用 TBB):

enter image description here

最佳答案

一般来说,光流估计是一项安静且耗时的操作。我建议更改光流法。

DualTVL1OpticalFlow 是您可以使用的 OpenCV 中一种性能更高的方法。如果此方法仍然会减慢 calcOpticalFlowPyrLK,则应使用。但是这种方法是一种稀疏的运动估计方法,并不直接返回密集的运动场。为此:在框架的网格上初始化一组点(例如网格步长 = 10),使用这些点通过 calcOpticalFlowPyrLK 跟踪它们。跟踪点和初始点之间的差异为您提供了每个网格位置的光流。最后,您必须在网格点之间进行插值。例如。使用最近邻或线性插值。

关于c++ - 加速 OpticalFlow 算法 - OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37507645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com