Class HornSchunck<T extends ImageBase<T>,D extends ImageBase<D>>

Direct Known Subclasses:
HornSchunck_F32, HornSchunck_U8

public abstract class HornSchunck<T extends ImageBase<T>,D extends ImageBase<D>> extends Object

This is Horn-Schunck's well known work [1] for dense optical flow estimation. It is based off the following equation Ex*u + Ey*v + Et = 0, where (u,v) is the estimated flow for a single pixel, and (Ex,Ey) is the pixel's gradient and Et is the grave in intensity value. It is assumed that each pixel maintains a constant intensity and that changes in flow are smooth. This implementation is faithful to the original work and does not make any effort to improve its performance using more modern techniques.

[1] Horn, Berthold K., and Brian G. Schunck. "Determining optical flow." 1981 Technical Symposium East. International Society for Optics and Photonics, 1981.

  • Field Details

    • alpha2

      protected float alpha2
    • numIterations

      protected int numIterations
    • averageFlow

      protected ImageFlow averageFlow
    • resetOutput

      protected boolean resetOutput
    • derivX

      protected D extends ImageBase<D> derivX
    • derivY

      protected D extends ImageBase<D> derivY
    • derivT

      protected D extends ImageBase<D> derivT
  • Constructor Details

    • HornSchunck

      protected HornSchunck(float alpha, int numIterations, ImageType<D> derivType)
      alpha - Larger values place more importance on flow smoothness consistency over brightness consistency. Try 20
      numIterations - Number of iterations. Try 1000
  • Method Details

    • setNumIterations

      public void setNumIterations(int numIterations)
      changes the maximum number of iterations
      numIterations - maximum number of iterations
    • process

      public void process(T image1, T image2, ImageFlow output)
      Computes dense optical flow from the first image's gradient and the difference between the second and the first image.
      image1 - First image
      image2 - Second image
      output - Found dense optical flow
    • computeDerivX

      protected abstract void computeDerivX(T image1, T image2, D derivX)
    • computeDerivY

      protected abstract void computeDerivY(T image1, T image2, D derivY)
    • computeDerivT

      protected abstract void computeDerivT(T image1, T image2, D derivT)
    • findFlow

      protected abstract void findFlow(D derivX, D derivY, D derivT, ImageFlow output)
      Inner function for computing optical flow
    • innerAverageFlow

      protected static void innerAverageFlow(ImageFlow flow, ImageFlow averageFlow)
      Computes average flow using an 8-connect neighborhood for the inner image
    • borderAverageFlow

      protected static void borderAverageFlow(ImageFlow flow, ImageFlow averageFlow)
      Computes average flow using an 8-connect neighborhood for the image border
    • computeBorder

      protected static void computeBorder(ImageFlow flow, ImageFlow averageFlow, int x, int y)
    • getExtend

      protected static ImageFlow.D getExtend(ImageFlow flow, int x, int y)