docs: public static <I extends ImageGray<I>, D extends ImageGray<D>>
  	DenseOpticalFlow<I> flowKlt(@Nullable PkltConfig configKlt, int radius , Class<I> inputType , Class<D> derivType ) {
  
  		if( configKlt == null )
  			configKlt = new PkltConfig();
  
  		if( derivType == null ) {
  			derivType = GImageDerivativeOps.getDerivativeType(inputType);
  		}
  
  		int numLayers = configKlt.pyramidScaling.length;
  
  		ImageType<I> imagetype = ImageType.single(inputType);
  		PyramidDiscrete<I> pyramidA = FactoryPyramid.discreteGaussian(configKlt.pyramidScaling, -1, 2, true, imagetype);
  		PyramidDiscrete<I> pyramidB = FactoryPyramid.discreteGaussian(configKlt.pyramidScaling, -1, 2, true, imagetype);
  
  		PyramidKltTracker<I, D> tracker = FactoryTrackerAlg.kltPyramid(configKlt.config, inputType, derivType);
  		DenseOpticalFlowKlt<I, D> flowKlt = new DenseOpticalFlowKlt<>(tracker, numLayers, radius);
  		ImageGradient<I, D> gradient = FactoryDerivative.sobel(inputType,derivType);
  
  		return new FlowKlt_to_DenseOpticalFlow<>(flowKlt, gradient, pyramidA, pyramidB, inputType, derivType);
  	}