Как передать изображение в градациях серого (opencv mat) в функцию JavaCv LBPHFaceRecognizer и получить данные гистограммы для каждого изображения? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу извлечь единую функцию lbp и гистограмму, используя OpenCV и JavaCV в Android.

Я новичок в обработке изображений.Я пытаюсь разработать приложение для распознавания лиц в Android с использованием OpenCV и JavaCV.Я делаю следующие шаги:

  1. Захват / выбор фотографии

  2. Обнаружено лицо кадрирования

  3. Преобразовать в оттенки серого

  4. Выравнивание гистограммы

  5. Функция извлечения с помощью LBP

  6. Получить данные гистограммы LBP

Я уже проделал 4 вышеописанных шага с OpenCV.Теперь мне нужно извлечь функцию с помощью LBP.Насколько мне известно, OpenCV не поддерживает функцию LBP свободно.Поэтому я должен использовать с JavaCV для извлечения функций.Теперь у меня есть данные изображения мата, которые уже были обработаны с выравниванием гистограммы OpenCV.

На шаге 5 я пытаюсь изменить данные мата OpenCV на данные мата JavaCV, поместить их в matvector и затем передать в LBPHFaceRecognizer.

На шаге 6 я пытаюсь получить данные гистограммы для каждого обнаруженного изображения в градациях серого.Но он вернул все 0 (я думаю, что это неверный результат).

Мой вопрос: я все еще делаю правильные шаги или неправильно?

Вот мой код:

if (facesArray.length > 0) {
mat = new Mat();
Rect rect = facesArray[0];

mat = orgImgMat.submat(rect);

Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY); //Changing Mat from rgb to gray scale

/*
 *JavaCv matvector
 */
System.setProperty("org.bytedeco.javacpp.maxphysicalbytes", "0");
System.setProperty("org.bytedeco.javacpp.maxbytes", "0");
MatVector images = new MatVector(facesArray.length);
org.bytedeco.opencv.opencv_core.Mat labels = new org.bytedeco.opencv.opencv_core.Mat(facesArray.length, 1, CV_32SC1);



/*
 * Histogram Equalization
 */
List<Mat> channels = new ArrayList<Mat>();
Core.split(mat, channels);
Imgproc.equalizeHist(channels.get(0), channels.get(0));
Core.merge(channels, mat);

System.out.println("Histogram mat " + mat);


/*
 *Convert Opencv mat to javacv mat
 */
org.bytedeco.opencv.opencv_core.Mat mat2 = new org.bytedeco.opencv.opencv_core.Mat((Pointer) null) {
    {
        address = mat.getNativeObjAddr();
    }
};
images.put(mat2);


/**
 * LBPHFaceRecognizer
 */
LBPHFaceRecognizer faceRecognizer = LBPHFaceRecognizer.create();
faceRecognizer.train(images, labels);


/**
 * MatVector and mat data from facerecognizer
 */

MatVector matVector= faceRecognizer.getHistograms();
org.bytedeco.opencv.opencv_core.Mat faceRecognizerMat= new 
org.bytedeco.opencv.opencv_core.Mat();

faceRecognizerMat= matVector.get(0);

/**
*Print mat as a matrix
*/
double[][] facerecogmatArray = ImagePreview.getMultiChannelArray(faceRecognizerMat);
System.out.println(Arrays.deepToString(facerecogmatArray));

}
...