【问题标题】:How can i load the cascadeClassifier in Android OpenCv如何在 Android OpenCv 中加载 cascadeClassifier
【发布时间】:2019-02-15 00:24:46
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: android opencv android-ndk java-native-interface


    【解决方案1】:

    您可以尝试在单例中缓存 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

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2014-09-18
      • 2017-03-01
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多