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 java.lang.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 Detail

      • alpha2

        protected float alpha2
      • numIterations

        protected int numIterations
      • averageFlow

        protected ImageFlow averageFlow
      • resetOutput

        protected boolean resetOutput
    • Constructor Detail

      • HornSchunck

        public 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 Detail

      • 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)