我正在研究android中的一个项目,我正在使用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)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很好但是检测面很慢.表现非常缓慢.当我调试代码然后我发现花时间的线是:
mJavaDetector.detectMultiScale(image,faceDetections,1.1,10,0,new Size(20,20),new Size(image.width(),image.height()));
我已经检查了多个帖子这个问题,但我没有得到任何解决方案.请告诉我该怎么做才能解决这个问题.
任何帮助将不胜感激.谢谢.
你应该注意以下参数detectMultiScale():
scaleFactor - 参数指定在每个图像比例下图像尺寸减少的程度.此参数用于创建比例金字塔.这是必要的,因为模型在训练期间具有固定的大小.没有金字塔,唯一要检测的大小就是这个修复(也可以从XML中读取).然而,通过使用多尺度表示(即,使用相同的检测窗口检测大面和小面),面部检测可以是尺度不变的.
scaleFactor取决于你训练有素的探测器的大小,但事实上,你需要设置尽可能高的同时仍然获得"好"的结果,所以这应该凭经验确定.
您的1.1值对于此目的而言可能是一个很好的价值.这意味着,使用相对较小的步长进行大小调整(将大小减小10%),可以增加与检测模型匹配大小的机会.如果训练有素的探测器尺寸为10x10,则可以检测尺寸为11x11,12x12的面部,依此类推.但实际上1.1因子要求金字塔中的层数(和2倍的计算时间)大约是1.2倍.
minNeighbors - 参数指定每个候选矩形应保留多少个邻居.级联分类器使用滑动窗口方法.通过应用此方法,您可以在窗口上滑动窗口,而不是调整窗口大小并再次搜索,直到无法进一步调整窗口大小.在每次迭代中,存储了(级联分类器的)真实输出,但遗憾的是它实际上检测到许多误报.并且为了消除误报并从检测中获得正确的面部矩形,应用邻域方法.3-6对它来说是一个很好的价值.如果该值太高,那么您也可能失去真正的积极因素.
minSize- 关于滑动窗口方法minNeighbors,这是级联可以检测的最小窗口.小于该值的对象将被忽略.通常cv::Size(20, 20)足以进行面部检测.
maxSize - 最大可能的对象大小.大于该值的对象将被忽略.
最后,您可以尝试基于不同功能的不同分类器(例如Haar,LBP,HoG).通常,LBP分类器比Haar快几倍,但也不太准确.
强烈建议您查看以下问题:
| 归档时间: |
|
| 查看次数: |
3845 次 |
| 最近记录: |