private void extractImageFeatures(
      MultiSpectral<T> color, T gray, FastQueue<TupleDesc> descs, List<Point2D_F64> locs) {
    detector.detect(gray);
    if (describe.getImageType().getFamily() == ImageType.Family.SINGLE_BAND)
      describe.setImage(gray);
    else describe.setImage(color);
    orientation.setImage(gray);

    if (detector.hasScale()) {
      for (int i = 0; i < detector.getNumberOfFeatures(); i++) {
        double yaw = 0;

        Point2D_F64 pt = detector.getLocation(i);
        double scale = detector.getScale(i);
        if (describe.requiresOrientation()) {
          orientation.setScale(scale);
          yaw = orientation.compute(pt.x, pt.y);
        }

        TupleDesc d = descs.grow();
        if (describe.process(pt.x, pt.y, yaw, scale, d)) {
          locs.add(pt.copy());
        } else {
          descs.removeTail();
        }
      }
    } else {
      orientation.setScale(1);
      for (int i = 0; i < detector.getNumberOfFeatures(); i++) {
        double yaw = 0;

        Point2D_F64 pt = detector.getLocation(i);
        if (describe.requiresOrientation()) {
          yaw = orientation.compute(pt.x, pt.y);
        }

        TupleDesc d = descs.grow();
        if (describe.process(pt.x, pt.y, yaw, 1, d)) {
          locs.add(pt.copy());
        } else {
          descs.removeTail();
        }
      }
    }
  }