2

我一直在寻找提取每个像素 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 中的数组,但我真的不知道如何使用这个数组提取速度向量。

提前致谢。

达维特

4

3 回答 3

2

Mat&flow:计算出的流动图像;将具有与 prevImg 相同的大小和类型 CV_32FC2

这种类型意味着每个像素的运动都有 2 个浮点变量(假定为 x 和 y)。尝试这个:

Optical_Flow.at<cv::Point2f>(1023,767).x
Optical_Flow.at<cv::Point2f>(1023,767).y
于 2013-05-21T15:26:01.443 回答
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 

}
于 2014-02-03T16:02:53.153 回答
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文件。

于 2016-08-24T12:08:21.717 回答