code: public static <T extends ImageGray<T>,D extends ImageGray<D>>
  	DenseOpticalFlow<T> hornSchunck( @Nullable ConfigHornSchunck config , Class<T> imageType )
  	{
  		if( config == null )
  			config = new ConfigHornSchunck();
  
  		HornSchunck<T,D> alg;
  		if( imageType == GrayU8.class )
  			alg = (HornSchunck)new HornSchunck_U8(config.alpha,config.numIterations);
  		else
  		if( imageType == GrayF32.class )
  			alg = (HornSchunck)new HornSchunck_F32(config.alpha,config.numIterations);
  		else
  			throw new IllegalArgumentException("Unsupported image type "+imageType);
  
  		return new HornSchunck_to_DenseOpticalFlow<>(alg, ImageType.single(imageType));
  	}
docs: The original Horn-Schunck algorithm.  Only good for very small motions.
  
  @see HornSchunck
  
  @param config Configuration parameters.  If null then default is used.
  @param imageType Type of input gray scale image
  @return dense optical flow