最近接到一個任務,要求是上傳一男一女的照片根據他們的特征生成出他們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();
}
}