JAVA实现人脸识别

来源:互联网 发布:2004年nba总决赛数据 编辑:程序博客网 时间:2024/05/18 03:12

 

最近接到一个任务,要求是上传一男一女的照片根据他们的特征生成出他们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();   

    }

}

 

 

 

但是做到这里又出现一个问题(事事难料啊 第一步都很难走) 项目会放到Linux上运行 .dll动态库文件在Linux下是无法调用的,虽然网上也提供了解决方案,但是项目经理还是建议我们不要使用OpenCV 希望我们自己去实现一套算法。但是我对图片色彩 像素方面的知识有限 以后是我初期的一个想法

 

 

首先灰度图片

 

 

和皮肤色彩相似的全部为白色 其他为黑色

 

 

计算白色范围 最后定位人脸

 

 

当然这还只是个想法,实现起来也有难度而且准确率并不高

 

 

以上说的 都是人脸定位的 ,而我本身的项目是一个让用户使用高兴类似于游戏的网站应用,是不是可以考虑不要那么高的准确率 自己定一个算法返回大部分用户满意的baby照片就可以了呢  这就请看以后的博文了。