我正在尝试使用Android上的OpenCV检测位图中的面部。如果我运行我的检测功能30次,前n次没有找到面,其中n约为7-15。探测器在第8-16次探测时开始找到面部,并在此之后始终如一地工作。这是使用相同的图像,没有任何改变(故意)。
发生了什么事?我缺少某种初始化步骤吗?为什么这不一致?
代码:
public ArrayList<Rect> detectFaces(Bitmap input) {
//Necessary for making the native detector happy
MatOfRect output = new MatOfRect();
//Convert our bitmap to a Mat so the detector can use it
Mat inputMat = new Mat(input.getWidth(), input.getHeight(), CvType.CV_8UC1);
bitmapToMat(input, inputMat);
Imgproc.cvtColor(inputMat, inputMat, Imgproc.COLOR_RGB2GRAY);
//Actually do the detection
mNativeDetector.detect(inputMat, output);
List<org.opencv.core.Rect> faceList = output.toList();
//Convert OpenCV Rects to Android Rects.
ArrayList<Rect> rectList = new ArrayList<Rect>();
for (org.opencv.core.Rect face : faceList){
rectList.add(OpenCvConversions.openCVToAndroidRect(face));
}
return rectList;
使用mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);
初始化了Detector,其中mCascadeFile是一个包含正面haar级联文件的File对象。
来自:
public void testFaces() throws IOException{
Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.face);
int detectedFaces = 0;
for (int i=0; i<30; i++){
ArrayList<Rect> faces = mFaceDetector.detectFaces(bitmap);
detectedFaces += faces.size();
System.out.println("Detected faces: " + detectedFaces);
}
}
mFaceDetector
是mFaceDetector = new FaceDetectorOpenCV();
,一个构造函数,它加载系统库和面部级联,并如上所述初始化DetectionBasedTracker。
答案 0 :(得分:0)
问题在于你没有使用面部检测器(CascadeClassifier)类,而是基于该检测器的面部跟踪器(DetectionBasedTracker)。
我没有在官方文档中找到这个类,也没有查看代码,因此我无法确切地告诉你它是如何工作的,但根据this page,它有一个参数minDetectionPeriod,这可能是您正在观察的行为的原因。
我认为除非检测到minDetectionPeriod次数最少,否则它不会返回轨道,以便过滤偶发的错误检测。