• OpenCV之稠密光流


    介绍

    参考链接

    OpenCV中,光流分为稀疏光流和稠密光流,关于稀疏光流可以参考之前的文章
    OpenCV之光流

    稠密光流的解释,可以参考OpenCV官方文档

    OpenCV提供了另一种算法来寻找密集的光流。它计算帧中所有点的光流。它基于Gunner Farneback的算法,该算法在Gunner法尔内巴克2003年的“基于多项式展开的双帧运动估计”中进行了解释。

    其实稀疏光流和稠密光流的区别,见名知义,稀疏光流是跟踪部分点,而稠密光流跟踪的是全部的点。

    实现

    OpenCV中的API如下:

    void cv::calcOpticalFlowFarneback(
    	InputArray 	prev,
    	InputArray 	next,
    	InputOutputArray 	flow,
    	double 	pyr_scale,
    	int 	levels,
    	int 	winsize,
    	int 	iterations,
    	int 	poly_n,
    	double 	poly_sigma,
    	int 	flags 
    )	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    参数解释

    • prev,前一帧8位单通道输入图像
    • next,当前帧图像,大小和类型与prev相同
    • flow,输出流图像,其大prev相同,类型为CV_32FC2
    • pyr_scale,指定为每个图像构建金字塔的图像比例(
    • levels,金字塔层数(包括初始图像); levels = 1意味着不会创建额外的图层,只会使用原始图像
    • winsize,平均窗口大小;较大的值提高了算法对图像的鲁棒性,并可以检测更快速的运动,但会产生更模糊的运动场
    • iterations,每个金字塔等级上执行迭代算法的迭代次数。用于在每个像素中查找多项式展开的像素邻域;
    • poly_n,用于在每个像素中找到多项式展开的像素邻域的大小;较大的值意味着图像将近似于更平滑的表面,从而产生更多鲁棒算法和更模糊的运动场,通常poly_n=5或7
    • poly_sigma,于平滑导数的高斯的标准偏差,用作多项式展开的基础;对于poly_n = 5,可以设置poly_sigma = 1.1,对于poly_n = 7,可以设置poly_sigma = 1.5;
    • flags,操作标志,可取计算方法有:
      OPTFLOW_USE_INITIAL_FLOW 使用输入流作为初始流近似。
      OPTFLOW_FARNEBACK_GAUSSIAN 使用Gaussian winsize×winsiz过滤器代替光流估计的相同大小的盒子过滤器;通常情况下,这个选项可以比使用箱式过滤器提供更精确的流量,代价是速度更低;通常,应将高斯窗口的胜利设置为更大的值以实现相同的稳健性水平。

    代码例子

    官方例子,计算得到一个具有光流矢量(u,v)的双通道阵列。我们找到了它们的大小和方向。我们对结果进行颜色编码,以便更好地可视化。方向对应于图像的色调值。幅值对应于“值”平面。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
        VideoCapture capture("../vtest.avi");
        if (!capture.isOpened()){
            //error in opening the video input
            cerr << "Unable to open file!" << endl;
            return 0;
        }
    
        Mat frame1, prvs;
        capture >> frame1;
        cvtColor(frame1, prvs, COLOR_BGR2GRAY);
    
        while(true){
            Mat frame2, next;
            capture >> frame2;
            if (frame2.empty())
                break;
            cvtColor(frame2, next, COLOR_BGR2GRAY);
    
            Mat flow(prvs.size(), CV_32FC2);
            calcOpticalFlowFarneback(prvs, next, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
    
            // visualization
            Mat flow_parts[2];
            split(flow, flow_parts);
            Mat magnitude, angle, magn_norm;
            cartToPolar(flow_parts[0], flow_parts[1], magnitude, angle, true);
            normalize(magnitude, magn_norm, 0.0f, 1.0f, NORM_MINMAX);
            angle *= ((1.f / 360.f) * (180.f / 255.f));
    
            //build hsv image
            Mat _hsv[3], hsv, hsv8, bgr;
            _hsv[0] = angle;
            _hsv[1] = Mat::ones(angle.size(), CV_32F);
            _hsv[2] = magn_norm;
            merge(_hsv, 3, hsv);
            hsv.convertTo(hsv8, CV_8U, 255.0);
            cvtColor(hsv8, bgr, COLOR_HSV2BGR);
    
            imshow("frame2", bgr);
    		imshow("img", prvs);
    
            int keyboard = waitKey(30);
            if (keyboard == 'q' || keyboard == 27)
                break;
    
            prvs = next;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    运行截图
    截图

  • 相关阅读:
    Centos7 gcc/g++安装以及运行程序
    Java生成World,Java操作world,Java导出world文档
    Web攻防01-ASP应用相关漏洞-HTTP.SYS&IIS短文件&文件解析&ACCESS注入
    弘辽科技:拼多多上货时间技巧是什么?要注意什么?
    jenkins容器中安装python遇到问题
    Linux(阿里云服务器)中安装Nginx命令
    Python从入门到高手的80行代码
    Mybatis-Plus之连表查询
    提示工程(Prompt Engineering)指南(入门篇)
    HDMI协议Ver2.0a(学习笔记)
  • 原文地址:https://blog.csdn.net/qq_36327203/article/details/127717762