49 lines
1.4 KiB
Java
49 lines
1.4 KiB
Java
import org.opencv.core.*;
|
|
import org.opencv.face.*;
|
|
import org.opencv.imgcodecs.*;
|
|
import org.opencv.imgproc.*;
|
|
import org.opencv.objdetect.*;
|
|
import java.util.*;
|
|
|
|
|
|
public class Facemark {
|
|
static {
|
|
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
if (args.length < 3) {
|
|
System.out.println("use: java Facemark [image file] [cascade file] [model file]");
|
|
return;
|
|
}
|
|
// read the image
|
|
Mat img = Imgcodecs.imread(args[0]);
|
|
|
|
// setup face detection
|
|
CascadeClassifier cascade = new CascadeClassifier(args[1]);
|
|
MatOfRect faces = new MatOfRect();
|
|
// detect faces
|
|
cascade.detectMultiScale(img, faces);
|
|
|
|
// setup landmarks detector
|
|
Facemark fm = Face.createFacemarkKazemi();
|
|
fm.loadModel(args[2]);
|
|
|
|
// fit landmarks for each found face
|
|
ArrayList<MatOfPoint2f> landmarks = new ArrayList<MatOfPoint2f>();
|
|
fm.fit(img, faces, landmarks);
|
|
|
|
// draw them
|
|
for (int i=0; i<landmarks.size(); i++) {
|
|
MatOfPoint2f lm = landmarks.get(i);
|
|
for (int j=0; j<lm.rows(); j++) {
|
|
double [] dp = lm.get(j,0);
|
|
Point p = new Point(dp[0], dp[1]);
|
|
Imgproc.circle(img,p,2,new Scalar(222),1);
|
|
}
|
|
}
|
|
// save result
|
|
Imgcodecs.imwrite("landmarks.jpg",img);
|
|
}
|
|
}
|