From d6cea3c43ef85cab22af0ef59bf3325ca4f2b87e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Ban=CC=81kowski?= Date: Mon, 26 Sep 2016 23:18:59 +0200 Subject: [PATCH] Enhance interop with Java When working with JVM based language and OpenCV you may have a ptr to the native Mat data. This binding allows passing it to the OpenALPR. Usage: Mat mat = ... alpr.recognize(mat.dataAddr(), mat.channels(), mat.width(), mat.height()) --- src/bindings/java/com_openalpr_jni_Alpr.h | 8 ++++++++ src/bindings/java/openalprjni.cpp | 18 ++++++++++++++++++ .../java/src/com/openalpr/jni/Alpr.java | 13 +++++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/bindings/java/com_openalpr_jni_Alpr.h b/src/bindings/java/com_openalpr_jni_Alpr.h index 95e3983..5418502 100644 --- a/src/bindings/java/com_openalpr_jni_Alpr.h +++ b/src/bindings/java/com_openalpr_jni_Alpr.h @@ -47,6 +47,14 @@ JNIEXPORT jstring JNICALL Java_com_openalpr_jni_Alpr_native_1recognize__Ljava_la JNIEXPORT jstring JNICALL Java_com_openalpr_jni_Alpr_native_1recognize___3B (JNIEnv *, jobject, jbyteArray); +/* + * Class: com_openalpr_jni_Alpr + * Method: native_recognize + * Signature: (JIII)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_openalpr_jni_Alpr_native_1recognize__JIII + (JNIEnv *, jobject, jlong, jint, jint, jint); + /* * Class: com_openalpr_jni_Alpr * Method: set_default_region diff --git a/src/bindings/java/openalprjni.cpp b/src/bindings/java/openalprjni.cpp index 7863843..711b17b 100644 --- a/src/bindings/java/openalprjni.cpp +++ b/src/bindings/java/openalprjni.cpp @@ -88,6 +88,24 @@ JNIEXPORT jstring JNICALL Java_com_openalpr_jni_Alpr_native_1recognize___3B return env->NewStringUTF(json.c_str()); } +JNIEXPORT jstring JNICALL Java_com_openalpr_jni_Alpr_native_1recognize__JIII + (JNIEnv *env, jobject thisObj, jlong data, jint bytesPerPixel, jint width, jint height) + { + //printf("Recognize data pointer"); + + AlprResults results = nativeAlpr->recognize( + reinterpret_cast(data), + static_cast(bytesPerPixel), + static_cast(width), + static_cast(height), + std::vector()); + + std::string json = Alpr::toJson(results); + + return env->NewStringUTF(json.c_str()); + } + + JNIEXPORT void JNICALL Java_com_openalpr_jni_Alpr_set_1default_1region (JNIEnv *env, jobject thisObj, jstring jdefault_region) { diff --git a/src/bindings/java/src/com/openalpr/jni/Alpr.java b/src/bindings/java/src/com/openalpr/jni/Alpr.java index ce49488..e72816b 100644 --- a/src/bindings/java/src/com/openalpr/jni/Alpr.java +++ b/src/bindings/java/src/com/openalpr/jni/Alpr.java @@ -15,6 +15,7 @@ public class Alpr { private native boolean is_loaded(); private native String native_recognize(String imageFile); private native String native_recognize(byte[] imageBytes); + private native String native_recognize(long imageData, int bytesPerPixel, int imgWidth, int imgHeight); private native void set_default_region(String region); private native void detect_region(boolean detectRegion); @@ -62,6 +63,18 @@ public class Alpr { } + public AlprResults recognize(long imageData, int bytesPerPixel, int imgWidth, int imgHeight) throws AlprException + { + try { + String json = native_recognize(imageData, bytesPerPixel, imgWidth, imgHeight); + return new AlprResults(json); + } catch (JSONException e) + { + throw new AlprException("Unable to parse ALPR results"); + } + } + + public void setTopN(int topN) { set_top_n(topN);