File: Facemark.java

package info (click to toggle)
opencv 4.5.1%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 268,248 kB
  • sloc: cpp: 969,170; xml: 682,525; python: 36,732; lisp: 30,170; java: 25,155; ansic: 7,927; javascript: 5,643; objc: 2,041; sh: 935; cs: 601; perl: 494; makefile: 145
file content (48 lines) | stat: -rw-r--r-- 1,450 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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);
    }
}