Android Studio enlaza las bibliotecas estáticas de OpenCV
Actualmente estoy trabajando en un proyecto que utiliza OpenCV3 para el procesamiento de video en tiempo real (aplicando un conjunto de filtros de color), y me las arreglé para conseguir que funcione con Java sin ningún problema.
Lo que intento hacer a continuación es implementar toda mi lógica Java a C ++ a través de NDK (para mejorar el rendimiento). De esta manera no necesitaré convertir el objeto MAT a buffers de byte de regreso y fort, guardando un par de ciclos. Pero estoy realmente atascado tratando de vincular las bibliotecas estáticas y las encabezadas de los archivos .so, utilizando gradle para ser utilizado en mis archivos .CPP.
- ¿Cómo reducir los partidos en el reconocimiento de patrones de OpenCV?
- Gradle android build para diferentes arquitecturas de procesador
- Android NDK. Ninguna sección de C / C ++ en las propiedades del proyecto de Eclipse
- ¿Cuál es la diferencia entre `opencv.android.JavaCameraView` y` opencv.android.NativeCameraView`
- Convertir mapa de bits a Mat después de capturar la imagen con la cámara de Android
Este es el archivo gradle que estoy usando:
apply plugin: 'com.android.model.application' def opencvandroid_sdk_path = file(project(':opencvandroid').projectDir).absolutePath + "/src/main" model { repositories { libs(PrebuiltLibraries) { opencv { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_calib3d.a") } } opencv1 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_core.a") } } opencv2 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_features2d.a") } } opencv3 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_flann.a") } } opencv4 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_highgui.a") } } opencv5 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgcodecs.a") } } opencv6 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgproc.a") } } opencv7 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_ml.a") } } opencv8 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_objdetect.a") } } opencv9 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_photo.a") } } opencv10 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_shape.a") } } opencv11 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_stitching.a") } } opencv12 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_superres.a") } } opencv13 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_video.a") } } opencv14 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videoio.a") } } opencv15 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videostab.a") } } } } android { compileSdkVersion = 23 buildToolsVersion = "23.0.2" defaultConfig.with { applicationId = "com.example" minSdkVersion.apiLevel = 16 targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" } } /* * native build settings */ android.ndk { moduleName = "hello-jni" /* * Other ndk flags configurable here are * cppFlags += "-fno-rtti" * cppFlags += "-fno-exceptions" * ldLibs = ["android", "log"] * stl = "system" */ platformVersion = 16 //same as minSdkVersion.apiLevel for better compatibility /*def jniPath = opencvandroid_sdk_path + "jniLibs" cppFlags += "-I${file(jniPath)}".toString() file(jniPath).eachDirRecurse { dir -> cppFlags += "-I${file(dir)}".toString() }*/ stl = "c++_static" ldLibs.addAll(["atomic", "log", "android"]) } android.sources { main { jni { dependencies { library "opencv1" linkage "static" library "opencv2" linkage "static" library "opencv3" linkage "static" library "opencv4" linkage "static" library "opencv5" linkage "static" library "opencv6" linkage "static" library "opencv7" linkage "static" library "opencv8" linkage "static" library "opencv9" linkage "static" library "opencv10" linkage "static" library "opencv11" linkage "static" library "opencv12" linkage "static" library "opencv13" linkage "static" library "opencv14" linkage "static" library "opencv15" linkage "static" } } } } android.buildTypes { release { minifyEnabled = false } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile project(':opencvandroid') }
Estoy basando mi archivo gradle en este ejemplo que encontré en github. Ahora, uno de los problemas que descubro tratando de hacerlo, es que OPENCV tiene un par de archivos de bibliotecas estáticas, así como este post dice, tengo que agregar cada uno en un lib diferente en gradle con el fin de vincularlos, por lo que Por eso mi archivo gradle está lleno de definiciones de la biblioteca que se repiten.
Ahora cuando estoy tratando de incluir los archivos de encabezados en mi código .CPP, Android Studio no puede encontrarlos (ni siquiera el espacio de nombres para usar). Este es mi código CPP:
#include <jni.h> #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/features2d/features2d.hpp" #include <vector> using namespace std; using namespace cv; extern "C" { JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba); JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba) { Mat& mGr = *(Mat*)addrGray; Mat& mRgb = *(Mat*)addrRgba; vector<KeyPoint> v; Ptr<FeatureDetector> detector = FastFeatureDetector::create(50); detector->detect(mGr, v); for( unsigned int i = 0; i < v.size(); i++ ) { const KeyPoint& kp = v[i]; circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255)); } } }
¿Estoy perdiendo algo para vincularlos correctamente?
- Pasar una matriz de Mats a código nativo
- Ejecutar código nativo en segundo plano
- Cómo deshabilitar / modificar AutoFocus y AutoWhiteBalance en Android Camera usando OpenCV
- Reconocimiento de imágenes - Descriptor binario representación en Mat - OpenCV Android
- Abra la cámara nativa de Android con OpenCV
- ¿Es posible hacer zoom y enfocar usando OpenCV en Android?
- Problema con OpenCV para Android en Android 5.0 (piruletas)
- OpenCV para Android: Error al cargar el error del clasificador en cascada
Hay dependencias entre las bibliotecas estáticas de OpenCV. Así que usted necesita para incluirlos en el orden correcto. .a y .o incluyen dependen del pedido en GCC, los archivos que tienen dependencias deben incluirse antes de los archivos de los que dependen:
CV_LIBS = \ $(CV_LIB_FOLDER)/libopencv_calib3d.a \ $(CV_LIB_FOLDER)/libopencv_highgui.a \ $(CV_LIB_FOLDER)/libopencv_video.a \ $(CV_LIB_FOLDER)/libopencv_objdetect.a \ $(CV_LIB_FOLDER)/libopencv_imgproc.a \ $(CV_LIB_FOLDER)/libopencv_imgcodecs.a \ $(CV_LIB_FOLDER)/libopencv_core.a \ $(CV_LIB_FOLDER)/libopencv_hal.a
- Problema en Android 6.0.1 "Excepción fatal: android.view.WindowManager $ BadTokenException"
- Adaptador base, cómo utilizar convertView cuando se muestran diferentes vistas