2016-10-27 7 views
1

Я новичок в OpenCV, и я хочу запустить программу Java для обнаружения лиц с помощью OpenCV.Как запустить много файлов haarcascade xml в одной и той же программе Java с помощью OpenCV?

Только в том числе один файл xarcascade xml не дает ожидаемых результатов. Поэтому мне нужно запустить два, три файла haarcascade в одной программе. (специально «haarcascade_frontalface_alt.xml» и «haarcascade_profileface.xml» вместе).

Я попытался сделать это со следующим кодом, но это не сработало. Пожалуйста, укажите, как действовать.

спасибо.

public class LiveFeed extends WatchDogBaseFrame { 

private DaemonThread myThread = null; 
int count = 0; 
VideoCapture webSource = null; 
Mat frame = new Mat(); 
MatOfByte mem = new MatOfByte(); 
CascadeClassifier faceDetector1 = new CascadeClassifier("/home/erandi/NetBeansProjects/WatchDog/src/ueg/watchdog/view/haarcascade_frontalface_alt.xml"); 
CascadeClassifier faceDetector2 = new CascadeClassifier("/home/erandi/NetBeansProjects/WatchDog/src/ueg/watchdog/view/haarcascade_eye.xml"); 
MatOfRect faceDetections = new MatOfRect(); 

public LiveFeed(WatchDogBaseFrame parentFrame) { 
    super(parentFrame); 
    initComponents(); 
    super.setCloseOperation(); 
    jButtonExit.setVisible(false); 
} 

//class of demon thread 
public class DaemonThread implements Runnable { 

    protected volatile boolean runnable = false; 

    @Override 
    public void run() { 
     synchronized (this) { 
      while (runnable) { 
       if (webSource.grab()) { 
        try { 
         webSource.retrieve(frame); 
         Graphics graphics = jPanelVideo.getGraphics(); 
         faceDetector1.detectMultiScale(frame, faceDetections); 
         faceDetector2.detectMultiScale(frame, faceDetections); 
         for (Rect rect : faceDetections.toArray()) { 
          // System.out.println("ttt"); 
          Imgproc.rectangle(frame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), 
            new Scalar(0, 255, 0)); 
         } 
         Imgcodecs.imencode(".bmp", frame, mem); 
         Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray())); 
         BufferedImage buff = (BufferedImage) im; 
         if (graphics.drawImage(buff, 0, 0, getWidth(), getHeight() - 150, 0, 0, buff.getWidth(), buff.getHeight(), null)) { 
          if (runnable == false) { 
           System.out.println("Paused ..... "); 
           this.wait(); 
          } 
         } 
        } catch (Exception ex) { 
         System.out.println("Error"); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Второй вызов 'faceDetector2.detectMultiScale (кадр, faceDetections);' будет превалировать результаты предыдущего класса, хранящиеся в 'faceDetections'. Создайте 2 переменные 'faceDetections1' и' faceDetections2', затем повторите их по отдельности, они не будут неявно конкатцировать результаты – ZdaR

ответ

0

Object Detection с использованием функций на основе Хаара каскад классификаторов является эффективным методом обнаружения объекта, предложенный Полом Viola и Майкл Джонс в своей статье, «Быстрое обнаружение объектов с помощью форсированного Каскад Simple Features» в 2001 г. Это основанный на машинном обучении подход, в котором каскадная функция обучается из множества положительных и отрицательных изображений. Затем он используется для обнаружения объектов на других изображениях.

OpenCV уже содержит много предварительно подготовленных классификаторов для лица, глаз, улыбки и т. Д. Эти файлы XML хранятся в каталоге opencv/data/haarcascades /.

Вы не можете одновременно запускать много каскадных файлов и увеличивать производительность. Но вы можете использовать их один за другим в виде цикла и передавать входные изображения через этот цикл.

Пример кода приведен в этой ссылке: OpenCv sample code