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.

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?

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 
  • Detección de objetos para android con tesseract o OpenCV
  • ¿Cómo traducir código OpenCV-C ++, que contiene punteros, a JAVA?
  • Gire la imagen en opencv dependiendo del ángulo de inclinación ...!
  • Correcta forma de convertir entre Bitmap y Mat en OpenCV en Android?
  • Opencv aumenta la precisión del umbral
  • Mejora del rendimiento de OpenCV Android: seguimiento rápido de objetos
  • ¿Cuál es la mejor manera de hacer el reconocimiento de números básicos?
  • Sugerencias para el reconocimiento de dígitos
  • OpenCV para Android: ejemplo simple para convertir la imagen a escala de grises
  • make: *** No se han especificado objetivos y no se ha encontrado ningún makefile. Detener
  • Configurar el modo de escena de la cámara para OpenCV en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.