Configurar el modo de escena de la cámara para OpenCV en Android

Estoy buscando una manera de establecer un valor de modo de escena para una cámara web desde c ++ (Android NDK).

OpenCV obtiene los valores de la cámara web cuando se inicializa. En el log a continuación, el registro dice Supported Scene Modes: auto,action,portrait,landscape,beach,fireworks,night,night-portrait,snow,sports,steadyphoto,sunset,theatre,barcode .

Me gustaría establecer uno de los valores (como la playa) para la cámara.

 D/OpenCV::camera﹕ CvCapture_Android::CvCapture_Android(1) D/OpenCV::camera﹕ Library name: libopencv_java.so D/OpenCV::camera﹕ Library base address: 0x69f3b000 D/OpenCV::camera﹕ Libraries folder found: /data/app-lib/gms.rewards.selfie-2/ D/OpenCV::camera﹕ CameraWrapperConnector::connectToLib: folderPath=/data/app-lib/gms.rewards.selfie-2/ E/OpenCV::camera﹕ ||libnative_camera_r4.1.1.so E/OpenCV::camera﹕ ||libnative_camera_r4.0.3.so E/OpenCV::camera﹕ ||libnative_camera_r2.3.3.so E/OpenCV::camera﹕ ||libnative_camera_r4.2.0.so E/OpenCV::camera﹕ ||libnative_camera_r2.2.0.so E/OpenCV::camera﹕ ||libnative_camera_r3.0.1.so E/OpenCV::camera﹕ ||libnative_camera_r4.3.0.so E/OpenCV::camera﹕ ||libnative_camera_r4.0.0.so E/OpenCV::camera﹕ ||libnative_camera_r4.4.0.so D/OpenCV::camera﹕ try to load library 'libnative_camera_r4.4.0.so' D/OpenCV::camera﹕ CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/gms.rewards.selfie-2/libnative_camera_r4.4.0.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "_ZN7android17IConsumerListenerD2Ev" referenced by "libnative_camera_r4.4.0.so"..." D/OpenCV::camera﹕ try to load library 'libnative_camera_r4.3.0.so' D/OpenCV::camera﹕ CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/gms.rewards.selfie-2/libnative_camera_r4.3.0.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "_ZN7android6Camera17setPreviewTextureERKNS_2spINS_22IGraphicBufferProducerEEE" referenced by "libnative_camera_r4.3.0.so"..." D/OpenCV::camera﹕ try to load library 'libnative_camera_r4.2.0.so' D/OpenCV::camera﹕ Loaded library '/data/app-lib/gms.rewards.selfie-2/libnative_camera_r4.2.0.so' D/OpenCV_NativeCamera﹕ CameraHandler::initCameraConnect(0x6a64eb6d, 1, 0x69359e18, 0x0) D/OpenCV_NativeCamera﹕ Connecting to CameraService v 2.3 D/OpenCV_NativeCamera﹕ Instantiated new CameraHandler (0x6a64eb6d, 0x69359e18) I/OpenCV_NativeCamera﹕ initCameraConnect: [antibanding=auto;antibanding-values=off,auto,50hz,60hz;auto-exposure-lock=false;auto-exposure-lock-supported=true;auto-exposure-lock-values=false,true;auto-whitebalance-lock=false;auto-whitebalance-lock-supported=true;auto-whitebalance-lock-values=false,true;effect=none;effect-values=mono,negative,none,posterize,sepia,aqua,solarize,nv-vivid,nv-emboss;exposure-compensation-step=0.1;flash-mode=off;flash-mode-values=off,on,auto,torch,red-eye;focal-length=1.000;focus-areas=(0,0,0,0,0);focus-distances=0.95,1.9,Infinity;focus-mode=fixed;focus-mode-values=fixed;horizontal-view-angle=60.000;jpeg-quality=95;jpeg-thumbnail-height=240;jpeg-thumbnail-quality=90;jpeg-thumbnail-size-values=0x0,320x240,240x320;jpeg-thumbnail-width=320;max-exposure-compensation=20;max-num-detected-faces-hw=10;max-num-focus-areas=0;max-num-metering-areas=4;max-zoom=28;metering-areas=(0,0,0,0,0);min-exposure-compensation=-20;picture-format=jpeg;picture-format-values=jpeg,jfif,exif,yuv420p,yuv420sp;picture-size=1280x960;pic D/OpenCV_NativeCamera﹕ Supported Cameras: (null) D/OpenCV_NativeCamera﹕ Supported Picture Sizes: 320x240,480x480,640x368,640x480,800x600,960x720,1024x768,1280x720,1280x752,1280x960,1440x1080,1600x1200,1836x1080,1920x1080,2048x1152,2048x1360,2048x1536,2592x1456,2592x1520,2592x1920,2592x1944 D/OpenCV_NativeCamera﹕ Supported Picture Formats: jpeg,jfif,exif,yuv420p,yuv420sp D/OpenCV_NativeCamera﹕ Supported Preview Sizes: 176x144,320x240,352x288,480x480,640x480,704x576,720x408,720x480,720x576,768x432,800x448,960x720,1280x720,1280x752,1280x960,1360x720,1440x1080,1920x1080,1920x1088,1920x1440 D/OpenCV_NativeCamera﹕ Supported Preview Formats: yuv420p,yuv420sp D/OpenCV_NativeCamera﹕ Supported Preview Frame Rates: 5,8,10,15,20,24,25,30 D/OpenCV_NativeCamera﹕ Supported Thumbnail Sizes: 0x0,320x240,240x320 D/OpenCV_NativeCamera﹕ Supported Whitebalance Modes: auto,incandescent,fluorescent,warm-fluorescent,daylight,cloudy-daylight,shade,twilight D/OpenCV_NativeCamera﹕ Supported Effects: mono,negative,none,posterize,sepia,aqua,solarize,nv-vivid,nv-emboss D/OpenCV_NativeCamera﹕ Supported Scene Modes: auto,action,portrait,landscape,beach,fireworks,night,night-portrait,snow,sports,steadyphoto,sunset,theatre,barcode D/OpenCV_NativeCamera﹕ Supported Focus Modes: fixed D/OpenCV_NativeCamera﹕ Supported Antibanding Options: off,auto,50hz,60hz D/OpenCV_NativeCamera﹕ Supported Flash Modes: off,on,auto,torch,red-eye D/OpenCV_NativeCamera﹕ initCameraConnect: preview format is set to yuv420sp D/OpenCV_NativeCamera﹕ Starting preview D/OpenCV_NativeCamera﹕ Preview started successfully 

Ejemplo de código (No es exactamente el mismo código que uso):

  cv::Mat inframe = cv::Mat(); cv::VideoCapture mCamera; mCamera.open(1); mCamera.set(CV_CAP_PROP_FRAME_WIDTH, 400); mCamera.set(CV_CAP_PROP_FRAME_HEIGHT, 300); // mCamera.set("scene mode", "beach"); // <-- looking for a way while (mCamera.isOpened()) { bool grab = mCamera.grab(); if (grab) { mCamera.retrieve(inframe, CV_CAP_ANDROID_COLOR_FRAME_RGB); // To do something for the iframe } else { LOGE("--->Cannot grab a frame from camera."); } } mCamera.release(); 

El único problema es que no hay ninguna API estandarizada para manejar la cámara por Android NDK. Es necesario pasar por Java, ya que el acceso NDK será específico para hardware particular.

Aunque hay una clase de VideoCapture en la interfaz C ++ de OpenCV, puedes usarla si implementas el enfoque de la Actividad Nativa, pero como NDK no proporciona API para el acceso de la cámara desde el código nativo, VideoCapture utiliza interfaces no documentadas que hacen que VideoCapture no sea universal. No funciona en algunos dispositivos antiguos o nuevos. Solo eche un vistazo a los problemas de la cámara nativa de OpenCV aquí .

Sugiero utilizar setSceneMode(String value) en el lado administrado, también puedes enviar una solicitud desde el lado nativo a administrar un modo de escena haciendo una conversión entre SCENE_MODE_# en el lado administrado y los enums correspondientes en el lado nativo (deberías implementar tú mismo).

Por cierto, aquí están las propiedades de las cámaras Android (del VideoCapture set() VideoCapture ): videoio.hpp # L263 – # L325


Actualización # 1:

Puede intentar extender las funcionalidades de camera_wrapper de OpenCV por CameraParameters para establecer el modo de escena (como el enfoque o el balance de blancos), pero podría haber diferencias entre algunas versiones de Android.

También tenga cuidado de que tiene que compilar el módulo androidcamera a todas las versiones de Android para trabajar en ellos. Por eso ves una gran cantidad de libnative_camera_r#.#.#.so OPENCV_ANDROID_PATH\sdk\native\libs\armeabi-v7a debajo de la carpeta OPENCV_ANDROID_PATH\sdk\native\libs\armeabi-v7a .

Después de muchas pruebas, encontré una de respuesta es que dejar de OpenCV. Significa controlar V4L2 directamente.

https://github.com/openxc/android-webcam

http://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html

  • Codificación de video Android con fr y manipulación de resolución
  • Reconocimiento de rostro inestable con OpenCV
  • Adición de archivos .so a jniLibs en Android Studio: archivos duplicados durante el envasado de APK
  • Características de OpenCV ORB
  • OpenCV para Android: Error al cargar el error del clasificador en cascada
  • Android, genera archivos de encabezado jni con javah, muestra error que no puede encontrar org.opencv.core.Mat
  • OpenCV en Android - Encabezados; No hay tal directorio de archivos
  • Integración de dependencias de Android Studio y Gradle
  • Umbral adaptable rápido para Canny Edge Detector en Android
  • Cómo devolver una imagen de opencv y mostrar en código androide java?
  • OpenCV referencias indefinidas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.