首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高安卓系统中OpenCV人脸检测性能?

如何提高安卓系统中OpenCV人脸检测性能?
EN

Stack Overflow用户
提问于 2015-02-20 06:20:55
回答 2查看 4.7K关注 0票数 1

我正在从事安卓系统的一个项目,在这个项目中,我使用OpenCV从画廊中的所有图像中检测人脸。从图像中获取人脸的过程在服务中执行。服务持续工作,直到所有的图像被处理。它将检测到的面存储在内部存储器中,如果活动被打开,也会显示在网格视图中。

我的代码是:

代码语言:javascript
复制
CascadeClassifier mJavaDetector=null;

public void getFaces()
{

    for (int i=0 ; i<size ; i++)        
    {

        File file=new File(urls.get(i));
        imagepath=urls.get(i);

        defaultBitmap=BitmapFactory.decodeFile(file, bitmapFatoryOptions);

        mJavaDetector = new CascadeClassifier(FaceDetector.class.getResource("lbpcascade_frontalface").getPath());

        Mat image = new Mat (defaultBitmap.getWidth(), defaultBitmap.getHeight(), CvType.CV_8UC1);
        Utils.bitmapToMat(defaultBitmap,image);

         MatOfRect faceDetections = new MatOfRect();
            try
            {
                mJavaDetector.detectMultiScale(image,faceDetections,1.1, 10, 0, new Size(20,20), new Size(image.width(), image.height()));
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }


        if(faceDetections.toArray().length>0)
        {


        }


    }
}   

一切都很好,但发现面部的速度很慢。表演很慢。当我调试代码时,我发现需要花费时间的一行是:

MJavaDetector.detectMultiScale(图像,面板检测,1.1,10,0,新尺寸(20,20),新大小(image.width(),image.height();

为了这个问题,我已经检查了多个帖子,但是我没有得到任何解决办法。请告诉我该怎么做才能解决这个问题。

任何帮助都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-02-20 10:01:54

您应该注意detectMultiScale()的参数

  • scaleFactor -参数指定图像大小在每个图像比例尺上缩小了多少。此参数用于创建比例金字塔。这是必要的,因为模型有一个固定的大小在训练期间。如果没有金字塔,唯一要检测的大小就是这个修复(也可以从XML读取)。然而,人脸检测可以采用多尺度表示,即使用相同的检测窗口检测大、小人脸。

scaleFactor取决于您经过训练的检测器的大小,但实际上,您需要在获得“良好”结果的同时尽可能地将其设置得更高,因此这应该由经验来确定。

为此目的,您的1.1值可以是一个很好的值。这意味着,一个相对较小的步骤用于调整大小(将大小减少10%),增加了匹配大小的机会,并找到了用于检测的模型。如果您经过训练的检测器的大小为10x10,则可以检测大小为11x11、12x12等的面部。但事实上,1.1的系数大约是金字塔中层数的两倍(计算时间是1.2的2倍)。

  • minNeighbors -参数指定每个候选矩形应该保留多少邻居。级联分类器采用滑动窗口方法。通过应用这种方法,您可以在图像上滑动一个窗口,而不是调整它的大小,然后再搜索,直到无法进一步调整它的大小。在每一次迭代中,都会存储真正的输出(级联分类器),但不幸的是,它实际上检测到了许多假阳性。为了消除假阳性,从检测中得到合适的人脸矩形,采用邻域方法。3-6是一个很好的价值。如果价值太高,那么你也可能失去真正的积极因素。
  • minSize -对于minNeighbors的滑动窗口方法,这是级联所能检测到的最小窗口。小于该对象的对象将被忽略。通常情况下,cv::Size(20, 20)对人脸检测是足够的。
  • maxSize -最大可能的对象大小。大于该值的对象将被忽略。

最后,您可以根据不同的特征(如Haar、LBP、HoG)尝试不同的分类器。通常,LBP分类器比Haar分类器快几倍,但也不太准确。

此外,我们亦强烈建议研究以下问题:

票数 10
EN

Stack Overflow用户

发布于 2015-02-21 19:57:58

相反,将图像读取为Bitmap,然后通过使用Utils.bitmapToMat(defaultBitmap,image)将它们转换为Mat,您可以直接使用Mat image = Highgui.imread(imagepath);,您可以检查这里imread()函数。

另外,由于探测器正在寻找至少尺寸(20,20)相当小的面孔,所以在线下花费了太多时间。检查视频,以便使用OpenCV实现人脸检测的可视化。

代码语言:javascript
复制
mJavaDetector.detectMultiScale(image,faceDetections,1.1, 10, 0, new Size(20,20), new Size(image.width(), image.height()));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28622792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档