如何从calcOpticalFlowFarneback中提取像素的速度矢量

时间:2013-05-21 14:02:01

标签: opencv opticalflow

我一直在寻找两个帧的每个像素b / n的速度矢量。我使用opencv函数作为流程:

calcOpticalFlowFarneback(Previous_Gray, Current_Gray, Optical_Flow, 0.5, 3, 15, 3, 5, 1.2, 0);

Previous_Gray = previous frame 
Current_Gray = current frame 

它给了我第三个参数Optical_Flow中的数组,但是我无法确定如何使用这个数组提取速度矢量。

先谢谢。

达维特

3 个答案:

答案 0 :(得分:2)

  

垫&安培;流:   计算出的流图像;将与prevImg具有相同的大小   并键入CV_32FC2

此类型表示每个像素的运动有2个浮点变量(假定为x和y)。 试试这个:

Optical_Flow.at<cv::Point2f>(1023,767).x
Optical_Flow.at<cv::Point2f>(1023,767).y

答案 1 :(得分:1)

void drawOptFlowMap (const Mat& flow, Mat& cflowmap, int step, double scale, const Scalar& color) {
 for(int y = 0; y < cflowmap.rows; y += step)
        for(int x = 0; x < cflowmap.cols; x += step)
        {
            const Point2f& fxy = flow.at<Point2f>(y, x);
            line(cflowmap, Point(x,y), Point(cvRound(x+fxy.x), cvRound(y+fxy.y)),
                 color);
            circle(cflowmap, Point(cvRound(x+fxy.x), cvRound(y+fxy.y)), 1, color, -1);
        }
    }


int main()
{
 ...read, declare images etc.... 
 cvNamedWindow("optical Flow", CV_WINDOW_NORMAL);

calcOpticalFlowFarneback(Previous_Gray, Current_Gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
cvtColor(Previous_Gray, cflow, CV_GRAY2BGR);
drawOptFlowMap(flow, cflow, 32, 50, CV_RGB(0, 255, 0));
imshow("optical Flow", cflow);
etc etc 

}

答案 2 :(得分:0)

要提取计算出的光流向量,您可以使用以下函数:

static void writeOpticalFlowVectors(const Mat& flow){
    std::ofstream myfile;
    std::string fullPath = "opticalFlowVectors.txt";
    myfile.open (fullPath.c_str());

    for(std::size_t x = 0; x < flow.rows; ++x){
        for(std::size_t y = 0; y < flow.cols; ++y){
            myfile << flow.at<cv::Point2f>(x,y).x;
            myfile<< ", ";
            myfile<< flow.at<cv::Point2f>(x,y).y;
            myfile << "\n";     
        }
    }
    myfile.close();
}

这将迭代输出Mat并将x, y形式的每个向量写入txt文件。