2017-09-04 70 views
1

我正在使用OpenCV通過相機檢測臉部的Android項目。該應用程序正確檢測臉部,但性能非常緩慢。我已經多次檢查過這個問題,但是我沒有找到任何解決方案。有什麼方法可以提高性能?如何在Android上通過OpenCV提高人臉檢測性能?

我的代碼是:

 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

如果您將沉重的提升移動到移動設備上,並在雲端進行操作,該怎麼辦? – Wayne

+0

非常感謝您的快速回答。我認爲這將是一個非常好的主意,儘管這要取決於我想要一個好的互聯網。你有沒有一些項目,它消除了雲的一些處理部分來指導我?如果是這樣會非常有幫助,非常感謝。 –

+0

@Wayne請記住,這意味着將每個映像的大小推向服務器。我在一個城市,我的LTE上行速度僅爲2 Mbps(我敢打賭,有很多人的情況變得更糟) –

回答

1

我看見你只執行一個Haar分類。我假設你使用frontleface一個。您可以將配置文件面部分類器(可在opencv haar包中獲得)合併到else語句中以提高準確性。一般來說,你可以訓練你想要的任何分類器並將它們合併。對於訓練分類器來說,這是一個非常棒的視頻here

+0

非常感謝你,這個想法將實現你所說的,但首先增加相機的速度。因爲如果我只用一個分類器慢下來,我認爲它會更糟。 –

+1

我之前用python做過類似的任務,用haar級聯進行人臉檢測的延遲很小,因爲它只是將幀處理爲xml。你把年齡變成了灰色嗎? – chrisckwong821

+0

我在我的項目中將框架變成灰色,並且性能變得更好,並且在臉部檢測中沒有失去準確性,感謝您的建議 –