- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在从事一个使用光流算法估计无人机位置的项目。为此,我目前正在使用 cv::calcOpticalFlowFarneback
。
我的硬件是一个 Odroid U3,它最终将连接到无人机飞行 Controller 。
问题是这种方法对于这个硬件来说真的很重,我正在寻找其他一些方法来优化/加速它。
我已经尝试过的事情:
WITH_TBB=ON BUILD_TBB=ON
并添加 -ltbb
进行编译)。添加我的代码的相关部分:
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
函数。最佳答案
一般来说,光流估计是一项安静且耗时的操作。我建议更改光流法。
DualTVL1OpticalFlow
是您可以使用的 OpenCV 中一种性能更高的方法。如果此方法仍然会减慢 calcOpticalFlowPyrLK
,则应使用。但是这种方法是一种稀疏的运动估计方法,并不直接返回密集的运动场。为此:在框架的网格上初始化一组点(例如网格步长 = 10),使用这些点通过 calcOpticalFlowPyrLK
跟踪它们。跟踪点和初始点之间的差异为您提供了每个网格位置的光流。最后,您必须在网格点之间进行插值。例如。使用最近邻或线性插值。
关于c++ - 加速 OpticalFlow 算法 - OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37507645/
我目前正在搜索各种光流代码(主要是算法的实现),目的是将它们收集到一个列表中,稍后可以以网站的形式发布。 以前有过这样的努力吗?如果是这样,它到达任何地方了吗? 最佳答案 是的,Matlab/C++:
我正在从事一个使用光流算法估计无人机位置的项目。为此,我目前正在使用 cv::calcOpticalFlowFarneback。 我的硬件是一个 Odroid U3,它最终将连接到无人机飞行 Cont
我正在开发 Android 视频稳定应用程序!我遇到了一些与 goodfeaturestotrack 和 calcOpticalFlowPyrLK 函数相关的问题,因为最终输出是相同的点!我用谷歌搜索
我是一名优秀的程序员,十分优秀!