/** @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."); }