Я хочу извлечь единую функцию lbp и гистограмму, используя OpenCV и JavaCV в Android.
Я новичок в обработке изображений.Я пытаюсь разработать приложение для распознавания лиц в Android с использованием OpenCV и JavaCV.Я делаю следующие шаги:
Захват / выбор фотографии
Обнаружено лицо кадрирования
Преобразовать в оттенки серого
Выравнивание гистограммы
Функция извлечения с помощью LBP
Получить данные гистограммы 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));
}