2012-08-24 15 views
10

Estoy tratando de desarrollar una aplicación para Android, y necesitaría obtener imágenes sin comprimir con una resolución lo más alta posible desde la cámara. Intenté tomar RawCallback y postviewCallback de picturePicture, pero no están funcionando.¿Cómo establecer la resolución de la cámara en Android con OpenCV?

Ahora estoy intentando con OpenCV (versión 2.4) usando VideoCapture, pero estoy atascado en el predeterminado 960x720, que es pobre para lo que necesito; y mi teléfono, un Samsung Galaxy S3, es capaz de proporcionar, teóricamente, hasta 8Mpx (3,264 × 2,448 para imágenes y 1,920 × 1,080 para video, según Wikipedia). VideoCapture.set (Highgui.CV_CAP_PROP_FRAME_WIDTH/HEIGHT, algún número) hace que la cámara devuelva una imagen negra por lo que he encontrado.

¿Hay alguna manera de obtener una resolución más alta, ya sea a través de OpenCV o con la API de Android, sin comprimir?

Lo siento mucho si esto se ha preguntado antes; He estado buscando días y no he encontrado nada.

¡Gracias por su tiempo!

EDITAR: Aunque no es exactamente lo que estaba preguntando, encontré que hay una manera de hacer algo muy similar: si configuras un OnPreviewCallback para la cámara, usando setPreviewCallback, obtienes los datos de la imagen en bruto del cámara (al menos en el S3 con el que estoy trabajando). Lo dejo aquí en caso de que alguien lo encuentre útil en el futuro.

EDIT: Una solución parcial se explica en la respuesta a continuación. En resumen,

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth); 
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight); 

funciona bajo ciertas condiciones; por favor mira abajo para más detalles.

Respuesta

2

Tienes que tener acceso a la vista previa de la cámara para obtener resoultions llamando al getSupportedPreviewSizes.

Después de esto, puede establecer cualquier resolución con el método setPreviewSize. Y no se olvide de setParameters al final. Actally muchos ejemplos OpenCV de Android contienen esta información (mira sample3).

1

En caso de que alguien encuentra este útil, he encontrado una solución (parcial): Si la variable VideoCapture se llama vc, esto debería funcionar:

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth); 
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight); 

cuenta que la combinación de la anchura y la altura debe ser uno de los formatos de imagen admitidos para su cámara, de lo contrario solo obtendrá una imagen en negro. Puede obtenerlos a través de Camera.Parameters.getSupportedPictureSizes().

Sin embargo, la configuración de una alta resolución parece exceder la capacidad del buffer de conversión YUV, por lo que todavía estoy luchando con eso. Voy a hacer una nueva pregunta separada para eso, para mantener todo más claro: new thread

0

setPreviewSize no establece la resolución de la imagen. setPictureSize hace.

Cuestiones relacionadas