code: private void detectCandidateFeatures(T image, double sigma) {
  		// adjust corner intensity threshold based upon the current scale factor
  		float scaleThreshold = (float) (baseThreshold / Math.pow(sigma, scalePower));
  		detector.setThreshold(scaleThreshold);
  		computeDerivative.setInput(image);
  
  		D derivX = null, derivY = null;
  		D derivXX = null, derivYY = null, derivXY = null;
  
  		if (detector.getRequiresGradient()) {
  			derivX = computeDerivative.getDerivative(true);
  			derivY = computeDerivative.getDerivative(false);
  		}
  		if (detector.getRequiresHessian()) {
  			derivXX = computeDerivative.getDerivative(true, true);
  			derivYY = computeDerivative.getDerivative(false, false);
  			derivXY = computeDerivative.getDerivative(true, false);
  		}
  
  		detector.process(image, derivX, derivY, derivXX, derivYY, derivXY);
  
  		intensities[spaceIndex].reshape(image.width, image.height);
  		intensities[spaceIndex].setTo(detector.getIntensity());
  
  		List<Point2D_I16> m = maximums[spaceIndex];
  		m.clear();
  		QueueCorner q = detector.getMaximums();
  		for (int i = 0; i < q.size; i++) {
  			m.add(q.get(i).copy());
  		}
  
  		spaceIndex++;
  		if (spaceIndex >= 3)
  			spaceIndex = 0;
  	}
docs: Use the feature detector to find candidate features in each level.  Only compute the needed image derivatives.