OpenCV:如何对通过calcOpticalFlowFarneback获得的载体应用过滤器
OpenCV: How to apply a filter on vectors obtained through calcOpticalFlowFarneback?
我已经找到并构建了一个光流图,我现在想删除任何低于某个阈值的向量。这是我设置Farneback光流的方式:
if (prevgray.empty() == false ) {
calcOpticalFlowFarneback(prevgray,gray,flowUmat, 0.4,1,50,2,5,1.2,0);
flowUmat.copyTo(flow);
for( int y=0; y<original.rows; y+=7){
for (int x=0;x<original.cols;x+=7){
const Point2f& flowatxy=flow.at<Point2f>(y,x);
line(original, Point(x,y), Point(cvRound(x+flowatxy.x*4), cvRound(y+flowatxy.y*4)), Scalar(0,255,0));
theta=atan((flowatxy.y)/(flowatxy.x)); //very unsure of this
circle(original, Point(x,y), 0.1, Scalar(0,0,0),-1);
}
}
gray.copyTo(prevgray);
}
else{gray.copyTo(prevgray);}
我正在考虑将每个向量与相邻向量或图像中所有向量的平均值进行比较。
要删除任何低于特定阈值的向量,您首先需要估计长度,例如丢弃长运动向量。您的循环将如下所示:
...
const Point2f& flowatxy=flow.at<Point2f>(y,x);
float flowVectorLength = flowatxy.x * flowatxy.x + flowatxy.y * flowatxy.y;
if( flowVectorLength > threshold * threshold)
continue;
...
实际上,运动矢量长度必须通过float flowVectorLength = sqrt(flowatxy.x * flowatxy.x + flowatxy.y * flowatxy.y);
计算,但为了避免平方根(sqrt)的计算复杂估计,您可以将其与threshold
的平方进行比较。
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- c++r值引用应用于函数指针
- 带过滤器的现代迭代c++集合
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 有没有任务栏API可以立即应用注册表更改
- 二项式模糊图像过滤器将内核应用于图像
- OpenCV:如何对通过calcOpticalFlowFarneback获得的载体应用过滤器
- 如何在C++应用程序中使用自定义捕获源过滤器
- 在我的加速度计数据上应用一些过滤器-Windows phone 8,C++
- OpenCV将我自己的过滤器应用于彩色图像
- 如何在DirectShow应用程序中设置IVP8Encoder过滤器的比特率
- 是否可以使用directshow源过滤器从应用程序读取数据?
- 如何在opencv中对一个图像应用多个过滤器