我想在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);
}
}
哪裏mFaceDetector
是mFaceDetector = new FaceDetectorOpenCV();
,它加載系統庫和麪部級聯並初始化DetectionBasedTracker如上構造。
根據您提供的代碼示例,任何事情都不會導致此問題。它本質上似乎是同步的,如果你每次都提供一個相同的位圖,那麼沒有任何理由不會在第一次工作。您可能需要分析比您在此處提供的更多代碼。 – 2015-01-20 19:55:26
沒有提供真正的附加代碼?我將用我正在調用detectFaces的測試更新我的問題。 – sqshemet 2015-01-20 19:56:52
這些第一個條目是否沒有拋出IOException?這是發生在一個單一的線程? – 2015-01-20 20:04:57