OpenCV + Android - 人脸识别不工作
OpenCV + Android - face recognition not working
我已经实现了这个项目:https://github.com/yaylas/AndroidFaceRecognizer into Android Studio. I included OpenCV using tutorial: https://www.youtube.com/watch?v=OTw_GIQNbD8(这是静态初始化)。此外,我在 Android Studio 设置中设置了正确的 NDK 位置。
问题是,如果我添加这个 Class:
package com.yaylas.sytech.facerecognizer;
import java.util.Vector;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import android.widget.Toast;
public class DetectionBasedTracker
{
public DetectionBasedTracker(String cascadeName, int minFaceSize, boolean isFaceDetector) {
mNativeObj = nativeCreateObject(cascadeName, minFaceSize, isFaceDetector);
}
public long getNativeObj(){
return mNativeObj;
}
public void setMinFaceSize(int size) {
nativeSetFaceSize(mNativeObj, size);
}
public void detect(Mat imageGray, MatOfRect faces) {
nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr());
}
public void release() {
nativeDestroyObject(mNativeObj);
mNativeObj = 0;
}
public static Vector<Mat> imageVector = new Vector<Mat>();
public static void addElement(Mat m){
imageVector.add(m);
System.out.println("--------------------------------- elementAdded: "+imageVector.size());
}
public static long getElementAt(int index){
if(index >= imageVector.size() || index < 0){
return 0;
}
System.out.println("-------------------------***** get element: "+imageVector.size()+" index: "+index);
return imageVector.elementAt(index).getNativeObjAddr();
}
public static int getImageCount(){
return imageVector.size();
}
private long mNativeObj = 0;
private static native long nativeCreateObject(String cascadeName, int minFaceSize, boolean faceDetection);
private static native void nativeDestroyObject(long thiz);
private static native void nativeStart(long thiz);
private static native void nativeStop(long thiz);
private static native void nativeSetFaceSize(long thiz, int size);
private static native void nativeDetect(long thiz, long inputImage, long faces);
}
返回错误:
Cannot resolve corresponding JNI function
我什么都试过了,还是报错。请问,哪里有问题?
运行时可能无法解析 JNI 函数的原因有多种。检验这些假设:
- 本机代码库未捆绑到您的 APK 中。在 APK 中查找它。
- 本机代码库在错误的 APK 目录中。再说一遍,看看。
- Java class 被 ProGuard 破坏,因此名称不再与本机库匹配。尝试关闭 ProGuard。对于调试版本应该关闭它。
- 如果您的本机代码库是为 ARM 编译的,但您 运行 在基于 x86 的 Android 模拟器中(反之亦然),它将无法加载该库。
- 想出更多的假设,然后检验它们。
页面 http://opencv.org/platforms/android.html 在 Android 上有很多关于 OpenCV 的信息,包括教程链接。
我已经实现了这个项目:https://github.com/yaylas/AndroidFaceRecognizer into Android Studio. I included OpenCV using tutorial: https://www.youtube.com/watch?v=OTw_GIQNbD8(这是静态初始化)。此外,我在 Android Studio 设置中设置了正确的 NDK 位置。 问题是,如果我添加这个 Class:
package com.yaylas.sytech.facerecognizer;
import java.util.Vector;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import android.widget.Toast;
public class DetectionBasedTracker
{
public DetectionBasedTracker(String cascadeName, int minFaceSize, boolean isFaceDetector) {
mNativeObj = nativeCreateObject(cascadeName, minFaceSize, isFaceDetector);
}
public long getNativeObj(){
return mNativeObj;
}
public void setMinFaceSize(int size) {
nativeSetFaceSize(mNativeObj, size);
}
public void detect(Mat imageGray, MatOfRect faces) {
nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr());
}
public void release() {
nativeDestroyObject(mNativeObj);
mNativeObj = 0;
}
public static Vector<Mat> imageVector = new Vector<Mat>();
public static void addElement(Mat m){
imageVector.add(m);
System.out.println("--------------------------------- elementAdded: "+imageVector.size());
}
public static long getElementAt(int index){
if(index >= imageVector.size() || index < 0){
return 0;
}
System.out.println("-------------------------***** get element: "+imageVector.size()+" index: "+index);
return imageVector.elementAt(index).getNativeObjAddr();
}
public static int getImageCount(){
return imageVector.size();
}
private long mNativeObj = 0;
private static native long nativeCreateObject(String cascadeName, int minFaceSize, boolean faceDetection);
private static native void nativeDestroyObject(long thiz);
private static native void nativeStart(long thiz);
private static native void nativeStop(long thiz);
private static native void nativeSetFaceSize(long thiz, int size);
private static native void nativeDetect(long thiz, long inputImage, long faces);
}
返回错误:
Cannot resolve corresponding JNI function
我什么都试过了,还是报错。请问,哪里有问题?
运行时可能无法解析 JNI 函数的原因有多种。检验这些假设:
- 本机代码库未捆绑到您的 APK 中。在 APK 中查找它。
- 本机代码库在错误的 APK 目录中。再说一遍,看看。
- Java class 被 ProGuard 破坏,因此名称不再与本机库匹配。尝试关闭 ProGuard。对于调试版本应该关闭它。
- 如果您的本机代码库是为 ARM 编译的,但您 运行 在基于 x86 的 Android 模拟器中(反之亦然),它将无法加载该库。
- 想出更多的假设,然后检验它们。
页面 http://opencv.org/platforms/android.html 在 Android 上有很多关于 OpenCV 的信息,包括教程链接。