2016-11-17 3 views
0

Я пытаюсь написать детектор человека, он работает сейчас, но иногда он реагирует на кошек/ящиков и т. Д., Также я получаю как 5 кадров в секунду. Итак, вопрос в том, как я могу улучшить свой алгоритм для лучшей точности fps и обнаружения.Как я могу улучшить алгоритм обнаружения людей openCV

Я пытался использовать этот один: http://www.pyimagesearch.com/2015/11/09/pedestrian-detection-opencv/

Но я не мог найти способ я мог бы использовать это на андроид.

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {  
     List<MatOfPoint> list = new ArrayList<>(); 
      Mat frame = new Mat(); 
      Mat gray = new Mat(); 
      Mat hierarchy = new Mat(); 
      Mat originalFrame = inputFrame.rgba(); 


      Imgproc.medianBlur(originalFrame,originalFrame,3); 
      Imgproc.cvtColor(originalFrame, gray, Imgproc.COLOR_RGB2GRAY, 0); 

      HOGDescriptor hog = new HOGDescriptor(); 
      //Получаем стандартный определитель людей и устанавливаем его нашему дескриптору 
      MatOfFloat descriptors = HOGDescriptor.getDefaultPeopleDetector(); 
      hog.setSVMDetector(descriptors); 
      MatOfRect locations = new MatOfRect(); 
      MatOfDouble weights = new MatOfDouble(); 
      hog.detectMultiScale(gray, locations, weights); 

      Point rectPoint1 = new Point(); 
      Point rectPoint2 = new Point(); 
      Point fontPoint = new Point(); 

      if (locations.rows() > 0) { 
       List<Rect> rectangles = locations.toList(); 
       for (Rect rect : rectangles) { 
        rectPoint1.x = rect.x; 
        rectPoint1.y = rect.y; 
        fontPoint.x = rect.x; 
        fontPoint.y = rect.y - 4; 
        rectPoint2.x = rect.x + rect.width; 
        rectPoint2.y = rect.y + rect.height; 
        final Scalar rectColor = new Scalar(0 , 0 , 0 ); 
        // Добавляем на изображения найденную информацию 
        Imgproc.rectangle(originalFrame, rectPoint1, rectPoint2, rectColor, 2); 
       } 
      } 


      frame.release(); 
      gray.release(); 
      hierarchy.release(); 
      list.clear(); 

      return originalFrame; 
     } 

ответ

0

Вы используете подход HOG + SVM для обнаружения людей; это по своей сути будет довольно медленным. Тем не менее, вы можете использовать некоторые из предложений в этом вопросе How to speed up svm.predict?

В зависимости от вашей проблемы, то есть, если камера статична и пешеходы движутся, вы можете выбрать подход к вычитанию фона, это, вероятно, самый эффективный способ но имейте в виду, что это подхватит любые объекты, которые движутся в сцене, поэтому вы можете включить пороговые значения для удаления небольших объектов. Некоторые алгоритмы вычитания фона включают смесь гауссовых (MOG) или MOG2 или GMG. Кроме того, важно отметить, что эти подходы основаны на создании фоновой модели сцены, то есть они предполагают, что статические пиксели с течением времени будут частью фона, следовательно, когда пешеход некоторое время остается на сцене, они получают встроенный в фоновый рисунок, что приводит к обнаружению пропусков. Есть много документов, которые предоставляют потенциальные решения этой проблемы, поэтому вы можете взглянуть на них, вот что дает достойные результаты: Static and Moving Object Detection Using Flux Tensor with Split Gaussian Models

Кроме того, вы можете выбрать подход, основанный на данных, либо получить хорошо подготовленную модель и сделайте свое обнаружение, используя это или тренируйте самостоятельно, используя TensorFlow, Caffe или Torch и используйте модуль dnn opencv_contrib для обнаружения.

Смежные вопросы