Exemplo n.º 1
0
  /** @see ImageProcessor#process() */
  @Override
  public void process() {

    LOG.debug("Processing...");

    if (integralImage == null) {

      throw new RuntimeException("Integral image undefined!");
    }

    // Cleanup

    objects.clear();

    // Если ROI не определен, придется анализировать все изображение

    if (ROI == null) {

      ROI = new Rectangle(0, 0, integralImage.width - 1, integralImage.height - 1);
    }

    // Используется для оптимизации (alpha-pruning)

    double a = 0;

    // Обнаружение ведем от максимального масштаба к минимальному

    double scale =
        Math.min(ROI.getWidth() / params.cascade.width, ROI.getHeight() / params.cascade.height)
            * params.maxScale;

    do {

      final double r = detect(scale);

      if (params.detectBiggest) {

        // Pruning

        if (r > 0) {

          if (r > a) {

            a = r;

          } else break;
        }
      }

    } while ((scale -= params.scaleStep) >= params.minScale);

    if (params.detectBiggest) {

      // Сохраняем положение объекта с максимальным откликом

      ArrayList<HaarObject> t = new ArrayList<>();

      HaarObject mainObject = getMainObject();

      if (mainObject != null) {

        LOG.debug("Main object has score = " + mainObject.score);

        t.add(mainObject);
      }

      objects = t;

    } else {

      // Группируем обнаруженные возможные положения объектов

      groupByIntersection();
    }

    // Если надо выполняем трассировку откликов

    if (params.trace) {

      for (HaarObject object : objects) {

        final Rectangle r = object.rectangle;

        final HaarCascade cascade = getHaarCascade(r.getWidth() / (double) params.cascade.width);

        object.trace =
            HaarCascadeEvaluator.traceHaarCascade(cascade, integralImage, r.getX(), r.getY());
      }
    }

    LOG.debug("Done.");
  }