Pregunta

Estoy leyendo este tutorial sobre cómo obtener datos de píxeles de la cámara del iPhone.

Si bien no tengo problemas para ejecutar y usar este código, necesito tomar la salida de los datos de la cámara (que vienen en BGRA) y convertirlos a ARGB para poder usarlos con una biblioteca externa.¿Cómo hago esto?

¿Fue útil?

Solución

Si tiene iOS 5.0, puede usar vImage dentro del marco Accelerate para realizar un intercambio de componentes de color optimizado para NEON usando un código como el siguiente (extraído de Apple Código fuente de WebCore):

vImage_Buffer src;
src.height = height;
src.width = width;
src.rowBytes = srcBytesPerRow;
src.data = srcRows;

vImage_Buffer dest;
dest.height = height;
dest.width = width;
dest.rowBytes = destBytesPerRow;
dest.data = destRows;

// Swap pixel channels from BGRA to RGBA.
const uint8_t map[4] = { 2, 1, 0, 3 };
vImagePermuteChannels_ARGB8888(&src, &dest, map, kvImageNoFlags);

dónde width, height, y srcBytesPerRow se obtienen de su búfer de píxeles a través de CVPixelBufferGetWidth(), CVPixelBufferGetHeight(), y CVPixelBufferGetBytesPerRow(). srcRows sería el puntero a la dirección base de los bytes en el búfer de píxeles, y destRows sería la memoria que asignó para contener la imagen RGBA de salida.

Esto debería ser mucho más rápido que simplemente iterar sobre los bytes e intercambiar los componentes de color.

Dependiendo del tamaño de la imagen, una solución aún más rápida sería cargar el marco en OpenGL ES, renderizar un rectángulo simple con esto como textura y usar glReadPixels() para bajar los valores RGBA.Aún mejor sería usar los cachés de texturas de iOS 5.0 tanto para la carga como para la descarga, donde este proceso solo toma de 1 a 3 ms para un cuadro de 720p en un iPhone 4.Por supuesto, usar OpenGL ES significa mucho más código de soporte para lograrlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top