Как я могу загрузить каскадный классификатор в Android OpenCv - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь перенести существующий проект opencv на Android.Но в текущей реализации в C ++ я загружаю cascadeClassifier один раз при запуске программы.Но в Android, если я вызываю свои нативные функции из onCameraFrame(), тогда мне приходится загружать файлы cascadeClassifier каждый раз, когда я передаю фрейм в нативный код, что является большой работой для устройства.

Есть ли способ загрузить cascadeClassifier один раз, а затем использовать его.Я имею в виду, как загрузить его в Java и передать его в JNI Call или любой другой альтернативе.(Я попытался передать загруженный cascadeClassifier из java в jni call, но я новичок в ndk. Поэтому я не смог этого сделать).Я хочу сделать это, потому что загрузка 4 cascadeClassifier каждого кадра делает приложение чоповым.

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете попытаться кэшировать экземпляр на стороне Java в Singleton и отослать его обратно из уровня JNI, используя методы JNI, например, у вас есть класс Java CascadeClassifierCacher, как показано ниже

package com.arophix.jniexample.jniobjects;

public class CascadeClassifierCacher {

    private static CascadeClassifier cascadeClassifierCache = null;

    public static CascadeClassifier getCacheInstance() {
        if(cascadeClassifierCache == null) {
            cascadeClassifierCache = new CascadeClassifier();
        }

        return cascadeClassifierCache;
    }
}

со стороны JNIвы можете ссылаться на него, используя следующий поток: (зная, что ваше полное имя пакета com.arophix.jniexample.jniobjects.CascadeClassifierCacher)

// Find the CascadeClassifierCacher class
jclass clazzId = env->FindClass("com/arophix/jniexample/jniobjects/CascadeClassifierCacher");
// Get the methodID
jmethodID jmethodIdGetCache = env->GetMethodID(clazz, "getCacheInstance", "()Lcom/arophix/jniexample/jniobjects/CascadeClassifierCacher;");
// Call getCacheInstance method.
jobject cacheInstance = (jobject) env->CallStaticObjectMethod(clazzId, jmethodIdGetCache);

Тогда вы можете использовать cacheInstance внутри вашей стороны JNI.

...