2015-02-28 3 views
1

Может ли кто-нибудь помочь мне с моей проблемой? Кажется, я не могу получить ответ из Интернета. Я искал, как весь день. Итак, вот моя проблема. Я создаю приложение Android для распознавания лиц, используя opencv4android 2.4.10 и Android Studio в качестве моей IDE.OpenCV4Android FaceRecognizer.predict (Mat src, int [] метки, двойная уверенность) против OpenCV FaceRecognizer.predict (Mat src)

Мне нужно использовать FaceRecognition.predict (Mat src, int [] метки, двойная [] уверенность), чтобы узнать, какое лицо обнаружено. Но в большинстве учебных пособий, которые у меня есть, есть только FaceRecognition.predict (Mat src) Я не уверен, где можно получить int [] метки и двойную уверенность []. Я был бы признателен, если бы кто-нибудь научил меня, как это сделать.

Пример кода:

File[] imageFiles = root.listFiles(imgFilter); 

Mat labels = new Mat(imageFiles.length, 1, CvType.CV_32SC1); 
List<Mat> images = (List<Mat>) new Mat(imageFiles.length); 

int counter = 0; 
int label; 

//get all person id and images 
for (File image : imageFiles) { 
    Mat img = Highgui.imread(image.getAbsolutePath(), 0); 
    images.add(counter, img); 

    label = Integer.parseInt(image.getName().split("-")[0]); 
    labels.put(counter, 0, label); 

    counter++; 
} 
//I created a java wrapper for this method 
//this works just fine. 
FaceRecognizer facerec = new FisherFacesRecognizer(); 

facerec.train(images, labels); 

//my problem is here, the parameters are supposed to be 
//*Mat src, int[] labels, double[] confidence* 
//but most tutorials only have *Mat src* 
int predictedLabel = facerec.predict(grayImg); 

ответ

2

обе функции по существу, делают то же самое - вернуть распознанный идентификатор.

Другая перегрузка дополнительно возвращает значение расстояния в лучший элемент из базы данных (меньше == лучше). поскольку невозможно вернуть более 1 значения из функции в java (или C++), это делается путем передачи по ссылке. так как использование:

int predictedLabel = facerec.predict(grayImg); 

или, (если вы хотите на поклоны расстояние):

int[] prediction = {0}; 
    double[] distance = {0}; 

    facerec.predict(grayImg, prediction, distance); 

    int predictedLabel = prediction[0]; 
    double dist = distance[0]; 
+0

спасибо! это работает отлично. –

+0

еще один вопрос sir, facerec.predict (grayImg, прогноз, расстояние); возвращает прогноз, даже если совпадения не найдено. Разве он не должен возвращать -1? почему моя возвращает случайную метку? –

+0

Это значение порога для конструктора. любой порог расстояния> будет отброшен во время распознавания, поэтому, когда он не найдет хороших результатов, он вернет -1, как и ожидалось. – berak