光流算法:光流算法框架

最近研究光流算法的过程中,对光流算法的基本架构有了一定的认识。发现几乎所有的光流算法都可以包含以下过程:
(1)多尺度计算:即建立图像金字塔,并在每层金字塔上计算光流,上一层计算的光流除以降采样因子(建高斯金字塔时的降采样因子)作为下一层光流计算时的初始光流。
(2)由粗到精的计算:即循环提纯I和J之间光流U。每次循环计算时,先将J进行平移(平移量是前一次循环计算的光流,对于第一次循环是上一层金字塔传过来的光流),从而减小计算时的搜索范围(因为I和平移后J更接近重合,即匹配点之间的距离缩小),本次循环的最终光流等于上次循环计算的最终光流U加上本次循环计算的光流dU。这个循环过程可表述为:U1=U0+dU1, U2=U1+dU2, U3=U2+dU3。
(3)核心计算:即算法核心,计算两幅图像之间的光流。经过以上两个过程,这两幅图像的匹配点之间的距离已经大大减小,所以计算起来也更容易。
以Brox的ECCV2004的光流算法为例,基于OpenCV的基本代码如下:

void main()
{
    uchar* data1 = NULL;
    uchar* data2 = NULL;
    float shift_x = 0;
    float shift_y = 0;
    int rows = 0;
    int cols = 0;
    int channels = 0;
    Brox brox;
    //brox参数设置
    brox.calcFlowMain(data1, data2, rows, cols, channels, &shift_x, &shift_y);
}
class Brox
{
public:
    //算法参数
    float delta; //颜色项权重
    float gamma; //梯度项权重
    float alpha; //平滑项权重
    float omega; //超松弛因子

    //算法参数
    float epsilon; //鲁棒因子,常取0.001
    float zeta; //数据项归一化因子
    int interpolationType;//插值方式

    //建高斯金字塔的参数
    float sigma;
    int minSize;
    float downscaleFactor;

    //迭代次数
    int scaleN;//执行0~scaleN-1
    int outerN;//执行0~outerN
    int innerN;//执行0~innerN
    int coreN;//执行0~coreN
public:
    float EnforceRange(float x, float MaxValue) {}
    void BilinearInterpolate(float* pImage, int width, int height, int channels, double x, double y, float *result){}

    void hfiltering(float *pSrcImage, float *pDstImage, int width, int height, int channels, double* pfilter1D, int fsize){}
    void vfiltering(float* pSrcImage, float *pDstImage, int width, int height, int channels, double* pfilter1D, int fsize){}

    void resizeImage(float *pSrcImage, float *pDstImage, int SrcWidth, int SrcHeight, int channels, double Ratio){}
    void resizeImage(float *pSrcImage, float *pDstImage, int SrcWidth, int SrcHeight, int channels, int DstWidth, int DstHeight){}

    void warpImage(float *pWarpIm2, float *pIm1, float *pIm2, float *pVx, float *pVy, int width, int height, int channels){}
public:
    void GaussianSmoothing(Mat_<float> &dst, Mat_<float> &src, double sigma, int fsize){}
    void buidPyramid(vector<Mat_<float>> &dst, Mat_<float> &src, double downscaleFactor){}

public:
    //0.算法参数
    Brox()
    {
        //算法参数
        delta = 0.5f; //颜色项权重
        gamma = 5.0f; //梯度项权重
        alpha = 1.0f; //平滑项权重
        omega = 1.6f; //超松弛因子

        //算法参数
        epsilon = 0.001f; //鲁棒因子
        zeta = 0.1f; //数据项归一化因子
        interpolationType = INTER_LINEAR;//插值方式

        //建高斯金字塔的参数
        sigma = 0.6;
        minSize = 25;
        downscaleFactor = 0.95;

        //迭代次数
        scaleN;//金字塔层数,动态确定
        outerN = 5;
        innerN;
        coreN = 25;//超松弛迭代次数
    }

哎,还是来图像片吧。

光流算法:光流算法框架_第1张图片光流算法:光流算法框架_第2张图片光流算法:光流算法框架_第3张图片光流算法:光流算法框架_第4张图片光流算法:光流算法框架_第5张图片光流算法:光流算法框架_第6张图片
























































你可能感兴趣的:(光流算法:光流算法框架)