Android OpenCV (4.2.0) Kurulumu (C++)
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
Native C++ projesini seçerek next’e tıklayalım.
3.OpenCV 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.
‘+’ işaretine basarak ‘Module Dependency’ seçeneğine daha sonra da ‘opencv’ modulüne tıklayarak OK’u seçelim.
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…