2017-09-04 3 views
1

Ich arbeite an einem Android-Projekt, bei dem ich OpenCV verwende, um Gesichter über die Kamera zu erkennen. Die Anwendung erkennt Gesichter korrekt, aber die Leistung ist sehr langsam. Ich habe mehrere Male nach diesem Problem gesucht, aber ich habe keine Lösung gefunden. Gibt es eine Möglichkeit, die Leistung zu verbessern?Wie verbessert man die Gesichtserkennung mit OpenCV auf Android?

Mein Code ist:

 QVideoFrame FilterRunnable::run(QVideoFrame *input, 
          const QVideoSurfaceFormat &surfaceFormat, 
          QVideoFilterRunnable::RunFlags flags) 
     { 
      input->map(QAbstractVideoBuffer::ReadOnly); 
      QImage image = imageWrapper(*input); 
      image = image.scaled(640,480); 
      cv::Mat mat(image.width(),image.height(),CV_8UC3,image.bits(),    image.bytesPerLine()); 

      vector<Rect> detectedFaces; 
      detectedFaces.clear(); 
      frontalFaceClassifier.detectMultiScale(mat, detectedFaces, 
            1.6, 3, 2 | CV_HAAR_SCALE_IMAGE , Size(60,60)); 

      qDebug()<<"Cantidad de caras en el vector : " << detectedFaces.size(); 
      if(detectedFaces.size() > 0){ 
       actualFace = detectedFaces.at(0); 

      countDetectedFaces++; 
      qDebug()<<"**********qwerty**********"<<detectedFaces.size(); 
      } 
      for(int i=0;i<detectedFaces.size();i++) 
      { 
      Rect dibujarCuadrado = detectedFaces.at(i); 

      cv::rectangle (mat, dibujarCuadrado, 20, 1, LINE_8, 0); 
      } 
     } 
+0

Was ist, wenn Sie das schwere Heben vom Handy wegbewegten, und tun Sie diesen Teil in der Wolke. – Wayne

+0

Vielen Dank für die schnelle Antwort. Ich denke, es wäre eine sehr gute Idee, obwohl es sehr davon abhängen würde, ein gutes Internet zu haben, denke ich. Haben Sie ein Projekt, in dem es einige Verarbeitungsteile in die Cloud eliminiert, um mich zu leiten? Wenn es so wäre, wäre es eine große Hilfe, vielen Dank. –

+0

@Wayne Denken Sie daran, dass das Übertragen eines Megabytes pro Bild auf den Server bedeuten würde. Ich bin in einer Stadt und meine LTE Upstream ist kaum 2 Mbps (Und ich wette, es gibt viele Menschen viel schlechter dran) –

Antwort

1

Ich sah nur ein haar Klassifizierer implementiert haben. Ich nehme an, Sie benutzen die Frontansicht. Sie können den Profilgesichtsklassifikator (verfügbar in opencv haar package) in eine else-Anweisung integrieren, um die Genauigkeit zu erhöhen. Im Allgemeinen können Sie jeden gewünschten Klassifikator trainieren und integrieren. Für das Training eines Klassifikators ist dies ein fantastisches Video. here

+0

Vielen Dank, die Idee wäre, auch das zu implementieren, was Sie sagen, aber zuerst die Geschwindigkeit der Kamera zu erhöhen. Denn wenn ich mit nur einem Klassifikator langsam gehe, denke ich mit zwei, dass es schlimmer wäre. –

+1

Ich habe eine ähnliche Aufgabe mit Python zuvor, Gesichtserkennung mit Haar-Kaskade hat wenig Latenz, weil es nur den Rahmen in das XML verarbeitet. Hast du deinen Rahmen in Grau verwandelt? – chrisckwong821

+0

Ich drehe den Rahmen in Grau in meinem Projekt und die Leistung wird besser und ohne Genauigkeit in der Gesichtserkennung verlieren, danke für Ihren Rat –

Verwandte Themen