Buscar..


Inicialización asíncrona

El uso de la inicialización asíncrona es una forma recomendada para el desarrollo de aplicaciones. Utiliza el Administrador de OpenCV para acceder a las bibliotecas de OpenCV instaladas externamente en el sistema de destino.

Fragmento de código implementando la inicialización asíncrona:

public class MainActivity extends Activity implements CvCameraViewListener2 {

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch(status) {
                case LoaderCallbackInterface.SUCCESS:
                    Log.i(TAG,"OpenCV Manager Connected");
                    //from now onwards, you can use OpenCV API
                    Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
                    break;
                case LoaderCallbackInterface.INIT_FAILED:
                    Log.i(TAG,"Init Failed");
                    break;
                case LoaderCallbackInterface.INSTALL_CANCELED:
                    Log.i(TAG,"Install Cancelled");
                    break;
                case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:
                    Log.i(TAG,"Incompatible Version");
                    break;
                case LoaderCallbackInterface.MARKET_ERROR:
                    Log.i(TAG,"Market Error");
                    break;
                default:
                    Log.i(TAG,"OpenCV Manager Install");
                    super.onManagerConnected(status);
                    break;
            }
        }
    };

    @Override
    public void onResume() {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
    }

    ...
}

En este caso, nuestra aplicación funciona con OpenCV Manager de forma asíncrona. OnManagerConnected devolución de llamada OnManagerConnected se llamará en el hilo de la interfaz de usuario, cuando finalice la inicialización.

Tenga en cuenta que no está permitido usar llamadas OpenCV o cargar bibliotecas nativas dependientes de OpenCV antes de invocar esta devolución de llamada. Cargue sus propias bibliotecas nativas que dependen de OpenCV después de la inicialización exitosa de OpenCV.

La implementación predeterminada de BaseLoaderCallback trata el contexto de la aplicación como Activity y llama al método Activity.finish() para salir en caso de un error de inicialización. Para anular este comportamiento, debe anular el método finish() de la clase BaseLoaderCallback e implementar su propio método de finalización.

Administrador de OpenCV

OpenCV Manager es un servicio de Android destinado a administrar binarios de bibliotecas de OpenCV en dispositivos de usuarios finales. Permite compartir las bibliotecas dinámicas de OpenCV entre aplicaciones en el mismo dispositivo.

El Administrador proporciona los siguientes beneficios:

  • Menos uso de memoria (alrededor de 40MB). Todas las aplicaciones utilizan los mismos binarios del servicio y no mantienen las librerías nativas dentro de ellas.
  • Optimizaciones específicas de hardware para todas las plataformas soportadas.
  • Fuente de confianza de la biblioteca OpenCV. Todos los paquetes con OpenCV se publican en el mercado de Google Play.
  • Actualizaciones regulares y correcciones de errores.

La única desventaja es que se le pide al usuario que descargue una aplicación adicional, por lo que la experiencia del usuario disminuye ligeramente.

Más información: Android OpenCV Manager

Actualizado 18/10/16:
Hay un error en la versión de OpenCV Manager distribuida en Play Store (actualizado el 21/09/15).
Sólo afecta a la versión OpenCV 3.1.0. Cuando ejecutas algunas funciones OpenCV, obtienes un error SIGSEGV . La versión distribuida con Android SDK funciona bien ( OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk ). Se puede descargar desde la web de OpenCV .
Más información: Edición # 6247 .

Inicialización Estática

De acuerdo con este enfoque, todos los binarios de OpenCV están incluidos en su paquete de aplicación. Está diseñado principalmente para propósitos de desarrollo y depuración. Este enfoque está en desuso para el código de producción, se recomienda la inicialización asíncrona.

Si el proyecto de su aplicación no tiene una parte JNI, simplemente copie las bibliotecas nativas de OpenCV correspondientes desde OpenCV-3.1.0-android-sdk/sdk/native/libs a su directorio de proyecto en la carpeta app/src/main/jniLibs .

En el caso del proyecto de aplicación con una parte JNI, en lugar de copiar las bibliotecas manuales, necesita modificar su archivo Android.mk : agregue las siguientes dos líneas de código después de "include $(CLEAR_VARS)" y antes de "include path_to_OpenCV-3.1.0-android-sdk/sdk/native/jni/OpenCV.mk" :

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

El resultado debe ser similar al siguiente:

include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk

Después de eso, las bibliotecas de OpenCV se copiarán a la carpeta jniLibs su aplicación durante la compilación JNI.

El último paso para habilitar OpenCV en su aplicación es el código de inicialización de Java antes de llamar a la API de OpenCV. Se puede hacer, por ejemplo, en la sección estática de la clase de actividad:

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}

Si su aplicación incluye otras bibliotecas nativas dependientes de OpenCV, debe cargarlas después de la inicialización de OpenCV:

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    } else {
        System.loadLibrary("my_jni_lib1");
        System.loadLibrary("my_jni_lib2");
    }
}

Nota: el método initDebug() está en desuso para el código de producción. Está diseñado solo para fines de desarrollo experimental y local. Si desea publicar su aplicación, utilice el enfoque con inicialización asíncrona.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow