如何在Android OpenCv中加载cascadeClassifier

问题描述 投票:0回答:1

我正在尝试将现有的opencv项目移植到Android。但是在c ++的当前实现中,我在程序启动时加载了cascadeClassifier。但是在android中如果我从onCameraFrame()调用我的本机函数,那么每次我将帧传递给本机代码时我都必须加载cascadeClassifier文件,这对于设备来说是很多工作。

有没有办法加载cascadeClassifier一次然后使用它。我的意思是像在java中加载它并将其传递给jni调用或任何其他替代方案。 (我尝试将加载的cascadeClassifier从java传递给jni调用,但我是ndk的新手。所以我无法这样做)。我想这样做是因为每帧加载4个cascadeClassifier会使应用程序变成chopy。

谢谢

android opencv android-ndk java-native-interface
1个回答
0
投票

您可以尝试在Singleton中将实例缓存在Java端,并使用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);

然后你可以在你的JNI方面使用cacheInstance

© www.soinside.com 2019 - 2024. All rights reserved.