Android OpenCV (4.2.0) Kurulumu (C++)

Sinem Kulaç
KOUOSL
Published in
3 min readMar 27, 2020

Açık kaynaklı görüntü işleme kütüphanesi olan OpenCV’nin Android ortamında C++ ile kullanımını ayrıntılı bir şekilde aşağıda anlatıyor olacağım. Android Studio’nun SDK Manager kısmından NDK,CMake ve LLDB’yi yüklemelisiniz.

1.OpenCV Android SDK

OpenCV android sdk’yı buradan indirip sıkıştırılmış dosyayı çıkartalım.

2.Proje Oluşturma

File > New > New Project

Native C++ projesini seçerek next’e tıklayalım.

3.OpenCV Import Module

Fıle > New >Import Module

İndirdiğimiz OpenCV’nin dosya yolunu girelim. Module name için ‘opencv’ yazalım.

Build.gradle(opencv) içindeki ilk satırda bulunan ‘application’ yerine ‘library’ yazalım. ‘applicationId “org.opencv”’ satırını silelim.

build.gradle(:app) ve build.gradle(:opencv)’de bulunan compileSdkVersion ve build ToolsVersion’un aynı olmasına dikkat edelim.

File > New > Project Structure > Dependencies

‘+’ işaretine basarak ‘Module Dependency’ seçeneğine daha sonra da ‘opencv’ modulüne tıklayarak OK’u seçelim.

app\src\main

Main içerisinde JNI Folder oluşturarak ismini ‘jniLibs’ yapalım. OpenCV klasöründe sdk\native\libs içerisinde bulunan 4 klasörü kopyalayıp jniLibs içerisine yapıştıralım.

4.Gradle.properties

Gradle.properties içine aşağıdaki satırı ekleyelim. OpenCV klasörünün bulunduğu dosya yolunu yazalım.

opencvsdk=E\:/user/opencv-4.2.0-android-sdk/OpenCV-android-sdk

5.Settings.gradle

Settings.gradle içine aşağıdaki satırları ekleyelim.

include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')

6.Build.gradle(:app)

Build.gradle(:app) içerisine defaultConfig içerisinde bulunan cmake’e aşağıdakileri ekleyelim.

externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native"
}
}

Dependencies kısmına aşağıdaki satırı ekleyelim.

dependencies {
...
implementation project(path: ':opencv')
}

7.CMakeList.txt

add_library kısmının hemen üzerine aşağıdakileri ekleyelim.

include_directories(${OpenCV_DIR}/jni/include)
add_library( lib_opencv SHARED IMPORTED )
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java4.so)

target_link_libraries kısmına aşağıdaki satırı ekleyelim.

lib_opencv

8.Native-lib.cpp

Native-lib.cpp’ye aşağıdaki fonksiyonları kopyalayalım.

#include <jni.h>
#include <string>
#include <opencv2/core.hpp>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_opencvnative_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_opencvnative_MainActivity_validate(JNIEnv *env, jobject thiz, jlong mad_addr_gr,jlong mat_addr_rgba) {
cv::Rect();
cv::Mat();
std::string hello2="hello from validate";
return env->NewStringUTF(hello2.c_str());
}

9.MainActiviy.java

MainActivity içerisinde native metodları çağıran satırları ve OpenCV / Native kütüphaneleri yükleyen satırları ekleyelim.

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.opencv.android.OpenCVLoader;
public class MainActivity extends AppCompatActivity {

private static String TAG="MainActivity";
static {
System.loadLibrary("native-lib");
System.loadLibrary("opencv_java4");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView=(TextView) findViewById(R.id.sample_text);
textView.setText(stringFromJNI());

// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
if (OpenCVLoader.initDebug()) {
textView.setText(textView.getText()+"\n OPENCV YUKLENDI");
textView.setText(textView.getText()+"\n"+validate(500,500));

} else {
Log.d(TAG, "MAALESEF OPENCV YUKLENEMEDI");

}
}
public native String stringFromJNI();
public native String validate(long madAddrGr,long matAddrRgba);
}

Projeyi derlediğimizde aşağıdaki şekilde çıktı alabiliyorsanız.

Tebrikler…

--

--