2015-01-20 83 views
0

我想在Android上使用OpenCV在位圖中檢測人臉。如果我運行我的檢測功能30次,前n次找不到臉部,其中n在7-15左右。檢測器開始在第8次到第16次檢測中找到臉部,並在此之後始終如一地工作。這是使用相同的圖像,沒有改變(故意)。OpenCV人臉檢測工作在相同的圖像不一致

這是怎麼回事?是否有某種我缺少的初始化步驟?爲什麼這不一致?

代碼:

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);初始化其中mCascadeFile是包含臉的正面哈爾級聯文件的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如上構造。

+0

根據您提供的代碼示例,任何事情都不會導致此問題。它本質上似乎是同步的,如果你每次都提供一個相同的位圖,那麼沒有任何理由不會在第一次工作。您可能需要分析比您在此處提供的更多代碼。 – 2015-01-20 19:55:26

+0

沒有提供真正的附加代碼?我將用我正在調用detectFaces的測試更新我的問題。 – sqshemet 2015-01-20 19:56:52

+0

這些第一個條目是否沒有拋出IOException?這是發生在一個單一的線程? – 2015-01-20 20:04:57

回答

0

問題是,您沒有使用面部檢測器(CascadeClassifier)類,而是使用基於該檢測器的面部跟蹤器(DetectionBasedTracker)。

我沒有在官方文檔中找到這個類,也沒有查看代碼,所以我不能告訴你它是如何工作的,但根據this page,它有一個參數minDetectionPeriod,可能是你正在觀察的行爲的原因。

我想它不會返回一個軌道,除非已經檢測到至少minDetectionPeriod次,以過濾零星的錯誤檢測。

+0

有趣。儘管作爲OpenCV一部分的DetectionBasedTracker看起來與那裏記錄的(不具有相同的參數或方法)非常不同,但這可能仍是問題。我並不完全相信這是我的特定應用程序的錯誤答案(在視頻中多次進行人臉檢測),但我會研究這一點。 – sqshemet 2015-01-20 21:29:30