如何在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);
}
}
我看见你只执行一个Haar分类。我假设你使用frontleface一个。您可以将配置文件面部分类器(可在opencv haar包中获得)合并到else语句中以提高准确性。一般来说,你可以训练你想要的任何分类器并将它们合并。对于训练分类器来说,这是一个非常棒的视频here
非常感谢你,这个想法将实现你所说的,但首先增加相机的速度。因为如果我只用一个分类器慢下来,我认为它会更糟。 –
我之前用python做过类似的任务,用haar级联进行人脸检测的延迟很小,因为它只是将帧处理为xml。你把年龄变成了灰色吗? – chrisckwong821
我在我的项目中将框架变成灰色,并且性能变得更好,并且在脸部检测中没有失去准确性,感谢您的建议 –
如果您将沉重的提升移动到移动设备上,并在云端进行操作,该怎么办? – Wayne
非常感谢您的快速回答。我认为这将是一个非常好的主意,尽管这要取决于我想要一个好的互联网。你有没有一些项目,它消除了云的一些处理部分来指导我?如果是这样会非常有帮助,非常感谢。 –
@Wayne请记住,这意味着将每个映像的大小推向服务器。我在一个城市,我的LTE上行速度仅为2 Mbps(我敢打赌,有很多人的情况变得更糟) –