【问题标题】: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。