如何将灰度图像(opencv垫)传递给LBPHFaceRecognizer JavaCv函数并检索每个图像的直方图数据?

时间:2019-06-17 16:34:13

标签: java opencv javacv

我想在Android中使用OpenCV和JavaCV提取统一的lbp特征和直方图。

我是图像处理的新手。我正在尝试使用OpenCV和JavaCV在android中开发人脸识别应用程序。我正在执行以下步骤:

  1. 捕获/拾取照片

  2. 裁剪检测到的脸部

  3. 转换为灰度

  4. 直方图均衡化

  5. 使用LBP提取功能

  6. 获取LBP的直方图数据

我已经使用OpenCV完成了上述4个步骤。我现在需要使用LBP提取功能。据我所知,OpenCV不免费支持LBP功能。因此,我必须使用JavaCV进行特征提取。现在,我有一个已经用OpenCV的直方图均衡处理过的图像数据。

对于第5步,我现在尝试将OpenCV mat数据更改为JavaCV mat数据,并放入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));

}

0 个答案:

没有答案