2017-01-20 8 views
1

Я нашел и построил карту оптического потока, теперь я бы хотел удалить любые векторы, которые опускаются ниже определенного порога. Это, как я создал свой Farneback оптический поток:OpenCV: Как применить фильтр к векторам, полученным через calcOpticalFlowFarneback?

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);} 

Я думал о чем-то сравнения каждого вектора соседних векторов или к среднему значению всех векторов в изображении.

ответ

0

Чтобы удалить любые векторы, которые упали ниже определенного порога, вам сначала необходимо оценить длину, если хотите, например. отбрасывать длинные векторы движения. Ваш цикл будет, чем выглядеть так:

...  
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);, но, чтобы избежать вычислений комплексной оценки квадратного корня (квадратный корень), вы можете сравнить его с квадратом threshold.