我想在Android中使用OpenCV和JavaCV提取统一的lbp特征和直方图。
我是图像处理的新手。我正在尝试使用OpenCV和JavaCV在android中开发人脸识别应用程序。我正在执行以下步骤:
捕获/拾取照片
裁剪检测到的脸部
转换为灰度
直方图均衡化
使用LBP提取功能
获取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));
}