Kali ini saya kan membahas bagaimana cara mendeteksi wajah dan senyuman pada foto potret seseorang. Kita akan menggunakan library yang dikembangkan oleh Google yaitu yang dibawa oleh Play Service Library versi 7.8. Dan ingat deteksi disini bukan recognition atau pencocokan yah, jadi hanya deteksi jika didalam gambar atau video ini ada wajah atau tidak, kemudian dengan bantuan Face API kita bisa mendeteksi apakah dari gambar atau video tersebut sedang senyum atau tidak.
Lebih jelasnya di dalam Face API terdapat beberapa method yang dapat temen-temen manfaatkan yaitu seperti :
- getIsLeftEyeOpenProbability() – Mengembalikan value antara 0 dan 1 atas probabilitas mata kiri terbuka atau tidak.
- getIsRighteyeOpenProbability() – Sama seperti diatas namun dengan untuk mata sebelah kanan.
- getIsSmilingProbability() -Mengembalikan value antara 0 dan 1 atas probabilitas bahwa wajah sedang tersenyum atau tidak.
Biar dapet experience-nya temen-temen boleh coba aplikasi dari Gookkis Studio di Play Store. Langsung instal dan cek sendiri yah.
Biar ga penasaran ini contoh video tutor cara penggunaan aplikasi Smile Score nya.
Udah cobain dan kerasa asik kan, jangan segan-segan buat rate sama share ke temen yang lain yah. Setelah asyik nyobain aplikasi sekarang yuk kita belajar buat aplikasi serupa.
Setup
Tambahkan kode dibawah ini dalam dependencies tag dalam file app/build.gradle file.
1 |
compile 'com.google.android.gms:play-services:8.4.0' |
Update activity_main.xml
Kode dibawah ini akan membuat satu button untuk load gambar dan satu button untuk deteksi wajah serta satu imageview untuk menampilkan gambar.
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 49 |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/tv_gookkis" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="http://wwww.gookkis.com" /> <LinearLayout android:id="@+id/linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/tv_gookkis" android:orientation="horizontal"> <Button android:id="@+id/btnLoadGambar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Load Gambar" /> <Button android:id="@+id/btnDeteksiWajah" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Deteksi Wajah" /> </LinearLayout> <ImageView android:id="@+id/img_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/linear_layout" android:layout_centerInParent="true" /> </RelativeLayout> |
Update MainActivity.java
Berikut kode dan penjelasan di dalam MainActivity.java
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
package com.gookkis.mobilevisionapi; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.SparseArray; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.google.android.gms.vision.Frame; import com.google.android.gms.vision.face.Face; import com.google.android.gms.vision.face.FaceDetector; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class MainActivity extends AppCompatActivity { //variable private static final int RQS_LOADIMAGE = 1; private Button btnLoadGambar, btnDeteksiWajah; private ImageView imgView; private Bitmap myBitmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //inisialisasi view btnLoadGambar = (Button) findViewById(R.id.btnLoadGambar); btnDeteksiWajah = (Button) findViewById(R.id.btnDeteksiWajah); imgView = (ImageView) findViewById(R.id.img_view); //perintah untuk mengambil gambar btnLoadGambar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); //melanjutkan ke intent lain dgn proses bitmap startActivityForResult(intent, RQS_LOADIMAGE); } }); //perintah button deteksi wajah btnDeteksiWajah.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (myBitmap == null) { Toast.makeText(MainActivity.this, "Anda belum memilih gambar yang akan dideteksi", Toast.LENGTH_LONG).show(); } else { deteksiWajah(); } } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RQS_LOADIMAGE && resultCode == RESULT_OK) { if (myBitmap != null) { myBitmap.recycle(); } try { InputStream inputStream = getContentResolver().openInputStream(data.getData()); myBitmap = BitmapFactory.decodeStream(inputStream); inputStream.close(); imgView.setImageBitmap(myBitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } super.onActivityResult(requestCode, resultCode, data); } //method untuk deteksi wajah private void deteksiWajah() { //Mendeteksi wajah FaceDetector faceDetector = new FaceDetector.Builder(getApplicationContext()) .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS).build(); //Deteksi apakah Play Service terdapat Mobile Vision API if (!faceDetector.isOperational()) { Toast.makeText(MainActivity.this, "Mobile Vision API tidak tersedia!", Toast.LENGTH_LONG).show(); } else { float ID_TEXT_SIZE = (float) myBitmap.getWidth() / 15; //Membuat gambar kotak untuk wajah yang terdeteksi Paint myRectPaint = new Paint(); //tebal garis myRectPaint.setStrokeWidth(5); //warna garis myRectPaint.setColor(Color.RED); //style paint hanya sebuah garis myRectPaint.setStyle(Paint.Style.STROKE); //Membuat paint untuk nilai score Paint mIdPaint = new Paint(); mIdPaint.setColor(Color.BLUE); mIdPaint.setTextSize(ID_TEXT_SIZE); //Membuat canvas untuk meletakan gambar dan kotak yang kita buat Bitmap tempBitmap = Bitmap.createBitmap(myBitmap.getWidth(), myBitmap.getHeight(), Bitmap.Config.RGB_565); Canvas tempCanvas = new Canvas(tempBitmap); tempCanvas.drawBitmap(myBitmap, 0, 0, null); Frame frame = new Frame.Builder().setBitmap(myBitmap).build(); SparseArray<Face> faces = faceDetector.detect(frame); //Mendeteksi apakah ada wajah atau tidak if (faces.size() == 0) { Toast.makeText(MainActivity.this, "Tidak ada wajah yang terdeteksi!", Toast.LENGTH_LONG).show(); } else { float ID_Y_OFFSET = 50.0f; //Menggambar kotak pada wajah for (int i = 0; i < faces.size(); i++) { Face thisFace = faces.valueAt(i); float x1 = thisFace.getPosition().x; float y1 = thisFace.getPosition().y; float x2 = x1 + thisFace.getWidth(); float y2 = y1 + thisFace.getHeight(); tempCanvas.drawRoundRect(new RectF(x1, y1, x2, y2), 2, 2, myRectPaint); //mengambil nilai probabilitas senyum String score = String.format("%.2f", thisFace.getIsSmilingProbability() * 100); //menambahkan pada canvas tempCanvas.drawText(score, x1, y2 + ID_Y_OFFSET, mIdPaint); } //menampilkan hasil wajah yang sudah terdeteksi dengan kotak imgView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap)); //menampilkan informasi selesai deteksi wajah Toast.makeText(MainActivity.this, "Deteksi Wajah Berhasil", Toast.LENGTH_LONG).show(); } } } } |
Kemudian coba Run, maka jika sudah benar seperti video dibawah ini.
Kemudian jika temen-temen butuh projectnya silahkan cek button dibawah ini.
Download View GithubOke itu aja dulu yah, Salam Pokoknya Ngoding….