【问题标题】:How to extract velocity vectors of a pixels from calcOpticalFlowFarneback如何从 calcOpticalFlowFarneback 中提取像素的速度向量
【发布时间】:2013-05-16 08:07:03
【问题描述】:

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

提前致谢。

达维特

【问题讨论】:

    标签: opencv opticalflow


    【解决方案1】:

    垫和流: 计算出的流动图像;将具有与 prevImg 相同的大小 并输入 CV_32FC2

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

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

    【讨论】:

    • 最好使用cv::Point2f 来访问像素位置,因为它来自 C++ API。否则,很好的答案。
    • 亲爱的 Perfanoff 和 A​​urelius, 非常感谢,它似乎有效。我是opencv的新手,如果我遇到任何问题,光流会回复你们:)谢谢。
    • 很高兴听到这个消息。如果答案对您有所帮助,请随时接受它是正确的:)
    • 伙计们,谢谢它工作正常。但是我有一个问题,这个 Optical_Flow.at<:point2f>().x Optical_Flow.at<:point2f>().y 给了我像素沿 x 和 y 轴向右移动的距离,但我想要什么是我期待的像素速度像这个像素旅行这么多。可能吗?再次感谢:)
    • 您可以使用 cartToPolar。
    【解决方案2】:
    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 
    
    }
    

    【讨论】:

    • 此代码将在窗口中显示计算出的密集光流。它不会提取任何计算信息以进行进一步操作。
    【解决方案3】:

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

    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 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多