我正在从事安卓系统的一个项目,在这个项目中,我使用OpenCV从画廊中的所有图像中检测人脸。从图像中获取人脸的过程在服务中执行。服务持续工作,直到所有的图像被处理。它将检测到的面存储在内部存储器中,如果活动被打开,也会显示在网格视图中。
我的代码是:
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();
为了这个问题,我已经检查了多个帖子,但是我没有得到任何解决办法。请告诉我该怎么做才能解决这个问题。
任何帮助都将不胜感激。谢谢。
发布于 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分类器快几倍,但也不太准确。
此外,我们亦强烈建议研究以下问题:
发布于 2015-02-21 19:57:58
相反,将图像读取为Bitmap,然后通过使用Utils.bitmapToMat(defaultBitmap,image)将它们转换为Mat,您可以直接使用Mat image = Highgui.imread(imagepath);,您可以检查这里的imread()函数。
另外,由于探测器正在寻找至少尺寸(20,20)相当小的面孔,所以在线下花费了太多时间。检查这视频,以便使用OpenCV实现人脸检测的可视化。
mJavaDetector.detectMultiScale(image,faceDetections,1.1, 10, 0, new Size(20,20), new Size(image.width(), image.height()));https://stackoverflow.com/questions/28622792
复制相似问题