如何在Android上通过OpenCV提高人脸检测性能?

问题描述:

我正在使用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(我敢打赌,有很多人的情况变得更糟) –

我看见你只执行一个Haar分类。我假设你使用frontleface一个。您可以将配置文件面部分类器(可在opencv haar包中获得)合并到else语句中以提高准确性。一般来说,你可以训练你想要的任何分类器并将它们合并。对于训练分类器来说,这是一个非常棒的视频here

+0

非常感谢你,这个想法将实现你所说的,但首先增加相机的速度。因为如果我只用一个分类器慢下来,我认为它会更糟。 –

+1

我之前用python做过类似的任务,用haar级联进行人脸检测的延迟很小,因为它只是将帧处理为xml。你把年龄变成了灰色吗? – chrisckwong821

+0

我在我的项目中将框架变成灰色,并且性能变得更好,并且在脸部检测中没有失去准确性,感谢您的建议 –