You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
6.4 KiB
C++
162 lines
6.4 KiB
C++
//
|
|
// Created by tunm on 2023/1/27.
|
|
//
|
|
|
|
#include <jni.h>
|
|
#include <string>
|
|
#include <android/log.h>
|
|
#include <stdlib.h>
|
|
#include <android/bitmap.h>
|
|
//#include <solexcv/log.h>
|
|
#include <opencv2/opencv.hpp>
|
|
#include "hyper_lpr_sdk.h"
|
|
#include "jni/common/jni_utils.h"
|
|
#include "log.h"
|
|
|
|
using namespace hyper;
|
|
|
|
extern "C" {
|
|
|
|
static double cost_ = 0.0;
|
|
|
|
JNIEXPORT long JNICALL HYPERLPR_API(core_HyperLPRCore_CreateRecognizerContext) (
|
|
JNIEnv *env,
|
|
jobject thiz,
|
|
jobject parameterObj) {
|
|
// get object class
|
|
jclass parameterCls = env->GetObjectClass(parameterObj);
|
|
// get object method id
|
|
jmethodID getModelPathMethodId = env->GetMethodID(parameterCls, "getModelPath", "()Ljava/lang/String;");
|
|
jmethodID getThreadsMethodId = env->GetMethodID(parameterCls, "getThreads", "()I");
|
|
jmethodID isUseHalfMethodId = env->GetMethodID(parameterCls, "isUseHalf", "()Z");
|
|
jmethodID getBoxConfThresholdMethodId = env->GetMethodID(parameterCls, "getBoxConfThreshold", "()F");
|
|
jmethodID getNmsThresholdMethodId = env->GetMethodID(parameterCls, "getNmsThreshold", "()F");
|
|
jmethodID getRecConfidenceThresholdMethodId = env->GetMethodID(parameterCls, "getRecConfidenceThreshold", "()F");
|
|
jmethodID getDetLevelMethodId = env->GetMethodID(parameterCls, "getDetLevel", "()I");
|
|
jmethodID getMaxNumMethodId = env->GetMethodID(parameterCls, "getMaxNum", "()I");
|
|
// get model path
|
|
jstring modelPath = (jstring ) env->CallObjectMethod(parameterObj, getModelPathMethodId, NULL);
|
|
std::string path = jstring2str(env, modelPath);
|
|
// get number of threads
|
|
jint threads = env->CallIntMethod(parameterObj, getThreadsMethodId, NULL);
|
|
// get is use half
|
|
jboolean useHalf = env->CallBooleanMethod(parameterObj, isUseHalfMethodId, NULL);
|
|
// get box conf threshold
|
|
jfloat boxConfThreshold = env->CallFloatMethod(parameterObj, getBoxConfThresholdMethodId, NULL);
|
|
// get nms threshold
|
|
jfloat nmsThreshold = env->CallFloatMethod(parameterObj, getNmsThresholdMethodId, NULL);
|
|
// get rec confidence threshold
|
|
jfloat textThreshold = env->CallFloatMethod(parameterObj, getRecConfidenceThresholdMethodId, NULL);
|
|
// get detect level
|
|
jint detLevel = env->CallIntMethod(parameterObj, getDetLevelMethodId, NULL);
|
|
// get max num level
|
|
jint maxNum = env->CallIntMethod(parameterObj, getMaxNumMethodId, NULL);
|
|
|
|
|
|
LOGD("input path: %s", path.c_str());
|
|
LOGD("threads: %d", threads);
|
|
LOGD("use half: %d", useHalf);
|
|
LOGD("det conf threshold: %f", boxConfThreshold);
|
|
LOGD("nms threshold: %f", nmsThreshold);
|
|
LOGD("text threshold: %f", textThreshold);
|
|
LOGD("det level: %d", detLevel);
|
|
|
|
// create context
|
|
HLPR_ContextConfiguration configuration = {0};
|
|
configuration.models_path = const_cast<char*>(path.c_str());
|
|
configuration.det_level = HLPR_DetectLevel(detLevel);
|
|
configuration.use_half = useHalf;
|
|
configuration.nms_threshold = nmsThreshold;
|
|
configuration.rec_confidence_threshold = textThreshold;
|
|
configuration.box_conf_threshold = boxConfThreshold;
|
|
configuration.threads = threads;
|
|
configuration.max_num = maxNum;
|
|
|
|
P_HLPR_Context ctx = HLPR_CreateContext(&configuration);
|
|
|
|
env->DeleteLocalRef(parameterCls);
|
|
|
|
return (long )ctx;
|
|
}
|
|
|
|
JNIEXPORT int JNICALL HYPERLPR_API(core_HyperLPRCore_ReleaseRecognizerContext) (
|
|
JNIEnv *env,
|
|
jobject thiz,
|
|
jlong handle) {
|
|
P_HLPR_Context ctx = (P_HLPR_Context ) handle;
|
|
|
|
return HLPR_ReleaseContext(ctx);
|
|
|
|
}
|
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL HYPERLPR_API(core_HyperLPRCore_PlateRecognitionFromBuffer) (
|
|
JNIEnv *env,
|
|
jobject thiz,
|
|
jlong handle,
|
|
jbyteArray buf,
|
|
jint height,
|
|
jint width,
|
|
jint rotation,
|
|
jint format) {
|
|
P_HLPR_Context ctx = (P_HLPR_Context ) handle;
|
|
|
|
uint8_t *pBuf = (uint8_t *) env->GetByteArrayElements(buf, 0);
|
|
// create ImageData
|
|
HLPR_ImageData data = {0};
|
|
data.data = pBuf;
|
|
data.width = width;
|
|
data.height = height;
|
|
data.format = HLPR_ImageFormat(format);
|
|
data.rotation = HLPR_Rotation(rotation);
|
|
// create DataBuffer
|
|
P_HLPR_DataBuffer buffer = HLPR_CreateDataBuffer(&data);
|
|
|
|
// exec plate recognition
|
|
HLPR_PlateResultList results = {0};
|
|
cost_ = (double)cv::getTickCount();
|
|
HLPR_ContextUpdateStream(ctx, buffer, &results);
|
|
cost_ = ((double)cv::getTickCount() - cost_) / cv::getTickFrequency();
|
|
LOGD("cost: %f", cost_);
|
|
|
|
jobjectArray jPlateArray = nullptr;
|
|
jclass jPlateCls = env->FindClass("com/hyperai/hyperlpr3/bean/Plate");
|
|
// get object method id
|
|
jmethodID plateClsInitId = env->GetMethodID(jPlateCls, "<init>", "()V");
|
|
jmethodID setX1MethodId = env->GetMethodID(jPlateCls, "setX1", "(F)V");
|
|
jmethodID setY1MethodId = env->GetMethodID(jPlateCls, "setY1", "(F)V");
|
|
jmethodID setX2MethodId = env->GetMethodID(jPlateCls, "setX2", "(F)V");
|
|
jmethodID setY2MethodId = env->GetMethodID(jPlateCls, "setY2", "(F)V");
|
|
// jmethodID setLayersMethodId = env->GetMethodID(jPlateCls, "setLayers", "(I)V");
|
|
jmethodID setTypeMethodId = env->GetMethodID(jPlateCls, "setType", "(I)V");
|
|
jmethodID setConfidenceMethodId = env->GetMethodID(jPlateCls, "setConfidence", "(F)V");
|
|
jmethodID setCodeMethodId = env->GetMethodID(jPlateCls, "setCode", "(Ljava/lang/String;)V");
|
|
|
|
int total = results.plate_size;
|
|
jPlateArray = env->NewObjectArray(total, jPlateCls, 0);
|
|
for (int i = 0; i < total; ++i) {
|
|
auto &plate = results.plates[i];
|
|
// set in location
|
|
jobject jPlate = env->NewObject(jPlateCls, plateClsInitId);
|
|
env->CallVoidMethod(jPlate, setX1MethodId, plate.x1);
|
|
env->CallVoidMethod(jPlate, setY1MethodId, plate.y1);
|
|
env->CallVoidMethod(jPlate, setX2MethodId, plate.x2);
|
|
env->CallVoidMethod(jPlate, setY2MethodId, plate.y2);
|
|
// set in types
|
|
// env->CallVoidMethod(jPlate, setLayersMethodId, plate.layers);
|
|
env->CallVoidMethod(jPlate, setTypeMethodId, plate.type);
|
|
// set in text_confidence
|
|
env->CallVoidMethod(jPlate, setConfidenceMethodId, plate.text_confidence);
|
|
// set in plate code
|
|
// env->CallObjectMethod(jPlate, setCodeMethodId, stringTojstring(env, plate.code));
|
|
env->CallObjectMethod(jPlate, setCodeMethodId, env->NewStringUTF(plate.code));
|
|
|
|
env->SetObjectArrayElement(jPlateArray, i, jPlate);
|
|
env->DeleteLocalRef(jPlate);
|
|
}
|
|
env->DeleteLocalRef(jPlateCls);
|
|
|
|
return jPlateArray;
|
|
}
|
|
|
|
} // extern
|