2012-09-18 30 views
6

Escribí una aplicación de Android que captura una vista previa en vivo de la cámara. Es importante tener un tiempo de obturación corto, que al menos debe ser constante.¿Alguna posibilidad de reducir el tiempo de obturación con el acceso a la cámara Android NDK?

Actualmente uso el siguiente código para lograr un tiempo de obturación baja:

Parameters params = camera.getParameters(); 
params.setSceneMode(Parameters.SCENE_MODE_SPORTS); 
params.setWhiteBalance(Parameters.WHITE_BALANCE_DAYLIGHT); 
params.setFlashMode(Parameters.FLASH_MODE_OFF); 
params.setFocusMode(Parameters.FOCUS_MODE_INFINITY); 

params.setPreviewFpsRange(9000, 29453); 
params.setPreviewFrameRate(29453); 
params.setJpegQuality(100); 
params.setPreviewFormat(ImageFormat.NV21); 

params.setPreviewSize(1280,720); 
params.setAntibanding(Parameters.ANTIBANDING_OFF); 
params.setExposureCompensation(params.getMinExposureCompensation()); 
params.set("iso", 1250); 
camera.setParameters(params); 

El setSceneMode() no parece estar apoyado en mi móviles firmware (getSupportedSceneModes devuelve una lista vacía). La configuración "ISO" posiblemente no tenga ningún efecto (no ha mirado la imagen, solo ha calculado la velocidad de fotogramas, aún). Acabo de encontrar este código en alguna parte y lo usé ... ¿tal vez es solo la cadena incorrecta?

Lo que sucede hasta ahora es: la velocidad de fotogramas cambia entre 9 y 29,453 fps, que es el único rango de frecuencia de fotogramas compatible. Entonces params.setPreviewFpsRange(29453, 29453); tampoco funciona. La frecuencia de cuadros es alta (20-30 fps) en buenas condiciones de luz (día normal, interiores, dirigida a la ventana) y se vuelve muy baja (8-10 fps) para luz media/baja (luz diurna, en interiores, directamente desde la ventana) condiciones

Más en detalle: No necesito una alta velocidad de cuadros, pero un tiempo de obturación bajo. Los datos recopilados se usarán para la navegación en interiores (o: Localización en interiores en un primer paso). La aplicación necesita tomar fotografías mientras una persona camina normalmente, sin que la persona se preocupe por cómo lleva el teléfono. La persona podría incluso correr o "balancear" el teléfono (ya que normalmente movería los brazos al caminar). Por lo tanto, generalmente hay una gran cantidad de "desenfoque de movimiento", ya que el tiempo de obturación es demasiado largo. La situación es muy diferente a las situaciones de "Quiero hacer una foto", donde la fotografía intenta mantener la cámara fija. En realidad, no queremos lograr "buenas fotos", pero de alguna manera queremos detectar algunos bordes de las paredes de vez en cuando. Espero mucho "ruido" en la imagen, pero espero que funcione de todos modos ...

La idea es que hay posibilidades de obtener un mayor control sobre los parámetros de la cámara utilizando el NDK. ¿Alguien ha tenido alguna experiencia con el NDK y me puede responder si vale la pena intentarlo?

Información adicional: Estoy usando un HTC Desire Z (también llamado: "T-Mobile G2" o "HTC Vision") como dispositivo de prueba.

Respuesta

5

La respuesta corta es "NO". La respuesta más larga comienza con una pregunta: su aplicación no se preocupa por la captura, pero solo utiliza los marcos de vista previa YUV, ¿es correcto?

Como una aplicación descargada estándar sin acceso de administrador, no tiene permisos para acceder a la cámara (u otro) dispositivo directamente. Solo tiene setParameters() API para afectar el comportamiento de la cámara, y por lo tanto está completamente a merced del OEM en cuanto a qué funcionalidad de la cámara está expuesta a través de esta API.

Incluso en un dispositivo rooteado, sus capacidades son limitadas, pero ahora las especifican los controladores del dispositivo y el ISP específico de la cámara.

En ambos casos, debe comenzar por elegir cuidadosamente el dispositivo de destino. Creo que algunos teléfonos Android permiten mucho más control de la cámara que HTC Vision. Por ejemplo, una versión modificada de Samsung S2 http://pfittech.com/rom_pfittech_jb.html cuenta con 25 FPS estables a 1080p.

+0

Me gustaría evitar cualquier compresión innecesaria de la imagen. Por lo tanto, la vista previa de los marcos YUV está bien. Incluso solo una imagen en escala de grises (Y-Layer) está bien. He rooteado los dispositivos de prueba. Como es un proyecto de investigación, esto está parcialmente bien ... pero si pudiera evitar la necesidad del acceso de root, lo tomaría ;-). - ¿Qué quiere decir con "versión modificada" (ROM personalizada?) ... tiene algunos colegas con un S2 ... tal vez vale la pena intentarlo. – SDwarfs

+0

Sí, el enlace apunta a una ROM personalizada para S2 sintonizado para el mayor rendimiento. De todos modos, para un proyecto de investigación, habría buscado un dispositivo con la cámara más versátil/abierta, que HTC Desire Z no es. –

+0

OTOH, si yo fuera tú, no descartaría la ruta de ** captura **. Tal vez produzca mejores resultados para ti. Tal vez cuando llamas 'takePicture()' al "obturador" * (lo pongo entre comillas porque esto no es un obturador real, pero el efecto de diferentes factores del ISP de la cámara sobre el desenfoque de movimiento) * será más corto? No puede obtener imágenes capturadas a 30 FPS, pero a medida que explica su algoritmo, puede estar bien obtener imágenes relativamente nítidas una vez por segundo. –

Cuestiones relacionadas