使用 OpenCV 在图像上生成光流

Posted

技术标签:

【中文标题】使用 OpenCV 在图像上生成光流【英文标题】:Generate Opticalflow on images using OpenCV 【发布时间】:2019-11-25 21:01:36 【问题描述】:

我正在尝试运行 OpenCV broxopticalflow 函数。 这是我的代码

int main(int argc, const char* argv[])

        //use GPU 0
        setDevice(0);

        //source and target dirs
        string sourceDir = "source";
        string targetDir = "output";

        vector<string> filesInDir=getFileNamesFromDirAsVector(sourceDir.c_str());

        Ptr<BroxOpticalFlow> ptr = cv::cuda::BroxOpticalFlow::create(0.197f, 50.0f, 0.8f, 5, 150, 10);//(alpha ,gamma ,scale ,inner_iterations ,outer_iterations ,solver_iterations);   

        cout<<"Calculate flow for dir "<<sourceDir.c_str()<<endl;
        for (vector<string>::size_type i = 0; i <(filesInDir.size()-1); ++i)



            string frame0Name=sourceDir+"/"+filesInDir[i] ;
            string frame1Name=sourceDir+"/"+filesInDir[i+1];
            Mat frame0Color = imread(frame0Name,0);
            Mat frame1Color = imread(frame1Name,0);



            //frame0Color.convertTo(frame0Color, CV_32FC1, 1.0 / 255.0);
            //frame1Color.convertTo(frame1Color, CV_32FC1, 1.0 / 255.0);

            Mat frame0Gray, frame1Gray;
            //cv::cvtColor(frame0Color, frame0Gray, cv::COLOR_BGR2GRAY);
            //cv::cvtColor(frame1Color, frame1Gray, cv::COLOR_BGR2GRAY);
            frame0Color.convertTo(frame0Gray,CV_32FC1, 1.0 / 255.0);
            frame1Color.convertTo(frame1Gray,CV_32FC1, 1.0 / 255.0);
            cuda::GpuMat d_frame0;
            cuda::GpuMat d_frame1;
            d_frame0.download(frame0Gray);
            d_frame1.download(frame1Gray);
            cuda::GpuMat d_fu;
            ptr->calc(d_frame0, d_frame1, d_fu);



大部分代码是从 github 复制的。当我运行这段代码时,我遇到了以下错误:

OpenCV(4.1.0) /src/opencv_contrib-4.1.0/modules/cudaoptflow/src/brox.cpp:132: error: (-215:Assertion failed) frame0.type() == CV_32FC1 in function 'calc'

calc 函数检查第一个参数是否为CV_32FC1 类型。这是代码失败的地方。基本上我的问题是如何将 gpu_mat 转换为所需的类型。我尝试了不同的方法,因为您可以看到代码中的注释行。如何将矩阵类型转换为 CV_32FC1?为什么我在代码中使用的转换在 github 上进行了很多实现却不起作用?

【问题讨论】:

【参考方案1】:

我对gpumat的下载和上传功能感到困惑。

    d_frame0.upload(frame0Gray);
    d_frame1.upload(frame1Gray);

上述更改修复了错误。

【讨论】:

以上是关于使用 OpenCV 在图像上生成光流的主要内容,如果未能解决你的问题,请参考以下文章

基于 OpenCV 图像的光流场

使用 python 的 OpenCV 光流

图像处理openCV光流法追踪运动物体

如何使用opencv实现金字塔光流lk跟踪算法

使用 OpenCV 的光流 - 水平和垂直组件

运动目标检测——光流法与opencv代码实现