Java实现人脸识别
最近接到一个任务,要求是上传一男一女的照片根据他们的特征生成出他们baby的相片,我的想法是首先人脸定位,截出人脸的标准图片,然后再截出他们各个五官的图片进行缩放最后再拼叠在婴儿图片的脸上反馈给用户,当然这只是一个想法 中间会有很多问题 不一定行的通,这样做一定要首先实现人脸定位。
直接用JAVA实现人类识别定位的例子在网上很难找到,多是依靠JNI 调用OpenCV本地方法实现的,那么这里先来说说这种方法,
先认识一下JNI 和OpenCV
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
OpenCV是Intel公司支持的开源计算机视觉库。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
了解了这两个东西使用JAVA 调用本地方法实现人脸识别就很简单了 先看看效果
这里可以看到,本地方法返回了人脸的位置矩形97 57 92 92
代码也很简单 只要导入相关XML文件 和库文件(haarcascade_frontalface_alt_tree.xml,JNI2OpenCV.dll 等等) 以下代码就可以实现
class JNIOpenCV {
static {
System.loadLibrary("JNI2OpenCV");
}
public native int[] detectFace(int minFaceWidth, int minFaceHeight, String cascade, String filename);
}
public class FaceDetection {
private JNIOpenCV myJNIOpenCV;
private FaceDetection myFaceDetection;
public FaceDetection() {
myJNIOpenCV = new JNIOpenCV();
String filename = "5.jpg";
String cascade = "haarcascade_frontalface_alt_tree.xml";
int[] detectedFaces = myJNIOpenCV.detectFace(40, 40, cascade, filename);
int numFaces = detectedFaces.length / 4;
System.out.println("numFaces = " + numFaces);
for (int i = 0; i < numFaces; i++) {
System.out.println("Face " + i + ": " + detectedFaces[4 * i + 0] + " " + detectedFaces[4 * i + 1] + " " + detectedFaces[4 * i + 2] + " " + detectedFaces[4 * i + 3]);
}
}
public static void main(String args[]) {
FaceDetection myFaceDetection = new FaceDetection();
}
}