Estoy tratando de crear una aplicación para Android que va a procesar los cuadros de la cámara en tiempo real. Para empezar, sólo quiero mostrar una versión en escala de grises de lo que la cámara ve. He conseguido extraer los valores apropiados de la matriz de bytes en el onPreviewFrame
método. A continuación es sólo un fragmento de mi código:
byte[] pic;
int pic_size;
Bitmap picframe;
public void onPreviewFrame(byte[] frame, Camera c)
{
pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width;
pic = new byte[pic_size];
for(int i = 0; i < pic_size; i++)
{
pic[i] = frame[i];
}
picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size);
}
La primera [width*height]
valores de la byte[]
marco de la matriz son la luminancia de la imagen (escala de grises) valores. Una vez que he extraído de ellos, ¿cómo puedo mostrar en la pantalla como una imagen? No es una matriz 2D, así que ¿cómo puedo especificar la anchura y la altura?
Usted puede obtener una amplia orientación de la OpenCV4Android SDK. Mirar en sus ejemplos, específicamente
Tutorial 1 Basic. 0 Android Camera
Pero, como lo fue en mi caso, para el intensivo de procesamiento de la imagen, de esta manera se consigue más lento de lo aceptable para una imagen en tiempo real de procesamiento de la aplicación.
Un buen reemplazo para su
onPreviewFrame
‘s byte de la matriz de conversión a YUVImage:YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);
Crear un rectángulo del mismo tamaño que la imagen.
Crear un ByteArrayOutputStream y pase esto, el rectángulo y la compresión de valor para compressToJpeg():
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);
byte [] imageData = baos.toByteArray();
Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);
De representación de estos previewFrames sobre una superficie y las mejores prácticas que se trata de una nueva dimensión. =)
Esta muy viejo post ha llamado mi atención ahora.
La API disponible en ’11 fue mucho más limitada. Hoy en día uno puede utilizar SurfaceTexture (ver ejemplo) a la vista previa de la cámara de flujo después de algunas manipulaciones.
Esta no es una tarea fácil de lograr, con la actual de Android tools/API disponible. En general, en tiempo real de procesamiento de imagen es mejor en el NDK nivel. Para que muestre solo el negro y el blanco, que todavía se puede hacer en java. La matriz de bytes que contiene el marco de datos está en formato YUV, donde el eje Y del Plano que ocurra primero. Por lo tanto, si usted consigue el sólo el eje Y del plano solo (primera altura de la anchura x bytes), que ya le da el negro y el blanco.
Hice lograr esto a través de un trabajo extenso y ensayos. Usted puede ver la aplicación en google:
https://play.google.com/store/apps/details?id=com.nm.camerafx