OpenCV人脸检测在同一图像上工作不一致

时间:2015-01-20 19:40:36

标签: java android opencv face-detection

我正在尝试使用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);
    }
}

mFaceDetectormFaceDetector = new FaceDetectorOpenCV();,一个构造函数,它加载系统库和面部级联,并如上所述初始化DetectionBasedTracker。

1 个答案:

答案 0 :(得分:0)

问题在于你没有使用面部检测器(CascadeClassifier)类,而是基于该检测器的面部跟踪器(DetectionBasedTracker)。

我没有在官方文档中找到这个类,也没有查看代码,因此我无法确切地告诉你它是如何工作的,但根据this page,它有一个参数minDetectionPeriod,这可能是您正在观察的行为的原因。

我认为除非检测到minDetectionPeriod次数最少,否则它不会返回轨道,以便过滤偶发的错误检测。