Memulai OpenCV dengan Android Studio

OpenCV (Open Source Computer Vision) adalah library untuk menangkap, memproses dan menampilkan gambar, baik 2D maupun 3D. OpenCV digunakan untuk pengenalan wajah, pengenalan gesture, deteksi gerakan dan lain-lain yang berkaitan dengan computer vision.

OpenCV telah dikembangkan cukup lama (dari 1999) dan tersedia untuk berbagai platform, termasuk Android. Masalahnya, kebanyakan tulisan tentang instalasi openCV menggunakan Eclipse+ADT dan belum menggunakan Android Studio. Tulisan ini menjadi pengantar memulai openCV di Android dengan menggunakan Android Studio. Berikut langkah-langkahnya.

  1. Download library openCV dari http://opencv.org/downloads.html dan pilih platform Android lalu ekstrak.
  2. Impor library openCV.  Jalankan Android Studio, pilih “Import project (Eclipse ADT, gradle, ADT)”, lalu pilih direktori \[opencv sdk]\sdk\java   Pilih target direktori yang berbeda dengan library openCV.  Jika gradle scyn gagal,  klik “try” agar AndroidStudio menginstall komponen yang diperlukan. Pastikan anda terhubung dengan internet.
  3. Sekarang kita akan buat project yang menggunakan openCV.   Klik new project.
  4. Pilih File –> Import  Module. Pilih direktori sesuai target direktori pada point no 2.  Check checbox “impor” dan ganti nama module menjadi :appOpenCV.
  5. Pada project strucutre, klik kanan, pilih  “Open Module Setting”.   Klik tab “dependency”.  Pilih tanda plus hijau di kanan atas –> module dependency. Pilih appOpenCV.
  6. Pada build.gradle, set targetSdkVersion 19   (jika tidak akan menyebabkan error di Android 5 ke atas)

Sekarang kita akan mencoba openCV,   contoh diambil dari \[opencv sdk]\samples\tutorial-1-camerapreview

Buka layout (acvity_main.xml), ganti isinya sebagai berikut:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<org.opencv.android.JavaCameraView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
android:id="@+id/tutorial1_activity_java_surface_view"
opencv:show_fps="true"
opencv:camera_id="any" />

<org.opencv.android.NativeCameraView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
android:id="@+id/tutorial1_activity_native_surface_view"
opencv:show_fps="true"
opencv:camera_id="any" />

</FrameLayout>

Jangan lupa tambahkan camera pada AndroidManifest.xml

     
    <uses-permission android:name="android.permission.CAMERA"/>

    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>;

Terakhir source code untuk MainActivity

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.Toast;


import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;


public class MainActivity extends ActionBarActivity implements CameraBridgeViewBase.CvCameraViewListener2 {

    private static final String TAG = "OCVSample::Activity";

    private CameraBridgeViewBase mOpenCvCameraView;
    private boolean              mIsJavaCamera = true;
    private MenuItem             mItemSwitchCamera = null;

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded successfully");
                    mOpenCvCameraView.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };

    public MainActivity() {
        Log.i(TAG, "Instantiated new " + this.getClass());
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.activity_main);

        if (mIsJavaCamera)
            mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
        else
            mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_native_surface_view);

        mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);

        mOpenCvCameraView.setCvCameraViewListener(this);
    }

    @Override
    public void onPause()
    {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onResume()
    {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    }

    public void onDestroy() {
        super.onDestroy();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        Log.i(TAG, "called onCreateOptionsMenu");
        mItemSwitchCamera = menu.add("Toggle Native/Java camera");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        String toastMesage = new String();
        Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);

        if (item == mItemSwitchCamera) {
            mOpenCvCameraView.setVisibility(SurfaceView.GONE);
            mIsJavaCamera = !mIsJavaCamera;

            if (mIsJavaCamera) {
                mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
                toastMesage = "Java Camera";
            } else {
                mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_native_surface_view);
                toastMesage = "Native Camera";
            }

            mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
            mOpenCvCameraView.setCvCameraViewListener(this);
            mOpenCvCameraView.enableView();
            Toast toast = Toast.makeText(this, toastMesage, Toast.LENGTH_LONG);
            toast.show();
        }

        return true;
    }

    @Override
    public void onCameraViewStarted(int width, int height) {

    }

    @Override
    public void onCameraViewStopped() {

    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        return inputFrame.rgba();
    }
}

Jalankan dengan menggunakan device (jangan emulator). Jika sukses App ini akan menampilkan isi kamera. Saat saya mencoba dengan Nexus 5, kamera berbasis java berhasil tapi nativenya gagal. Posting ini akan diupdate kalau saya sudah menemukan masalahnya.

9 comments on “Memulai OpenCV dengan Android Studio

  1. Pak Yudi, saya sudah coba lakukan langkah di atas. Waktu saya pakai, import modul tidak bisa/gagal. bisakah dibuat panduan interaktif/video?

  2. terimakasih Pak tutorial singkatnya – salam kenal
    cara di atas sudah saya lakukan dan sudah berhasil build tanpa error.
    tapi kok ketika di run di hape saya ga bisa ya?
    hape saya android ICS(API 14).
    sudah coba ganti targeSDK jga belum bisa.
    terimakasih Pak

  3. Selamat siang pak, saya sedang mengembangkan OCR dengan Opencv, apakah bapak bisa memberikan tutorial menambahkan opencv sebagai library pada project OCR yang saya miliki?

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.