Ensar Hamzaçebi

An Android Developer

Android Face Detection 03 - Landmarks Kullanımı

| Comments

Arkadaşlar bu yazımda landmarklardan bahsetmeye çalışıcam biraz. Evet landmarklar en basit haliyle Face API tarafından tespit edilen yüzler üzerindeki özel noktadara verilen isimdir. Yani sol göz, sağ göz, burun ucu, dudak sonu gibi yüzün belirli yerlerini işaret eden noktalardır.

Şimdi de landmarkları nasıl kullanıyoruz onu görelim. MainActivity'de onCreate methodumuza bakalım.

MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    InputStream stream = getResources().openRawResource(R.raw.image03);
    Bitmap bitmap = BitmapFactory.decodeStream(stream);

    FaceDetector detector = new FaceDetector.Builder(getApplicationContext())
            .setTrackingEnabled(false)
            .setLandmarkType(FaceDetector.ALL_LANDMARKS)
            .build();

    Frame frame = new Frame.Builder().setBitmap(bitmap).build();
    SparseArray<Face> faces = detector.detect(frame);

    CustomView overlay = (CustomView) findViewById(R.id.customView);
    overlay.setContent(bitmap, faces);

    detector.release();

}

Burada önceki örneklerimizden farklı olarak Face detectorumuzu oluştururken setLandmarkType(FaceDetector.ALL_LANDMARKS) ‘ın eklenmiş olmasıdır.

Bir sonraki adım, daha önceden oluşturduğumuz CustomView sınıfına landmarkları işaretliyecek fonksiyonu eklemek.

CustomView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void drawFaceAnnotations(Canvas canvas, double scale) {
    Paint paint = new Paint();
    paint.setColor(Color.GREEN);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(5);

    for (int i = 0; i < mFaces.size(); ++i) {
        Face face = mFaces.valueAt(i);
        for (Landmark landmark : face.getLandmarks()) {
            int cx = (int) (landmark.getPosition().x * scale);
            int cy = (int) (landmark.getPosition().y * scale);
            canvas.drawCircle(cx, cy, 10, paint);
        }
    }

}

Sınıfın tamamını merak edenler konu ile alakalı bir önceki yazıya bakabilirler.

Fonksiyonu ekledikten sonra onDraw() ‘da drawFaceRectangle() yerine yeni eklediğimiz drawFaceAnnotations() fonksiyonunu çağırmayı unutmuyoruz tabiki.

CustomView.java
1
drawFaceAnnotations(canvas, scale);

Uygulamamızı bu şekilde çalıştırdığımızda Face Detection'a bitmap olarak verdiğiniz yüz resminde şu şekilde landmarkların işaretlendiğini görebilirsiniz.

Şimdilik burada bırakıyorum ancan sonraki yazıda biraz da classification ‘dan bahsedicez. Herhangi bir hata ile karşılaşırsanız yorum yazmayı unutmayın. Kendinize iyi bakın.

Comments