2012-06-02 13 views
9

Conozco AVFoundation y su soporte de captura (aunque no demasiado familiar). Sin embargo, no veo ninguna API fácilmente accesible para obtener datos píxel por píxel (RGB por píxel o similar). Recuerdo leer en los documentos que esto es posible, pero realmente no veo cómo. Entonces:iOS: obtenga datos píxel por píxel desde la cámara

  1. ¿Se puede hacer esto? ¿Si es así, cómo?
  2. ¿Obtendré datos de imágenes en bruto o datos que han sido comprimidos en JPEG?

Respuesta

31

AV Foundation puede devolverle los bytes sin procesar para una imagen capturada por el video o la cámara. Debe configurar una sesión AVCaptureSession con un dispositivo AVCaptureDevice apropiado y una correspondiente AVCaptureDeviceInput y AVCaptureDeviceOutput (AVCaptureVideoDataOutput o AVCaptureStillImageOutput). Apple tiene algunos ejemplos de este proceso en su documentación, y requiere la configuración de un código repetitivo.

Una vez que haya configurado su sesión de captura y esté capturando datos de la cámara, configurará un método delegado -captureOutput:didOutputSampleBuffer:fromConnection:, donde uno de los parámetros será un CMSampleBufferRef. Que tendrá un CVImageBufferRef dentro del cual se accede a través del CMSampleBufferGetImageBuffer(). El uso de CVPixelBufferGetBaseAddress() en ese búfer de píxeles devolverá la dirección base de la matriz de bytes para los datos de píxeles en bruto que representan el marco de la cámara. Esto puede ser en algunos formatos diferentes, pero los más comunes son BGRA y YUV planar.

Tengo una aplicación de ejemplo que usa este here, pero le recomiendo que también consulte my open source framework que envuelve la plantilla estándar AV Foundation y facilita el procesamiento de imágenes en la GPU. Dependiendo de lo que quieras hacer con estos bytes crudos de la cámara, es posible que ya tenga algo que puedas usar allí o un medio de hacerlo mucho más rápido que con el procesamiento en la CPU.

+3

Finalmente se decidió a esto ... el código que envió aquí realmente ayudó sin embargo: http://stackoverflow.com/a/11615472/472768 Gracias! – FeifanZ

+0

¿Podría explicar qué debo proporcionar en ese caso en la entrada de esta función? 'AlprResults reconoce (unsigned char * pixelData, int bytesPerPixel, int imWWidth, int imgHeight, std :: vector regionsOfInterest);' Entiendo solo el punto sobre 'pixelData' y' regionsOfInterest'. –

+0

@SashaKid - No tengo idea de lo que hace esa función, y eso suena como una pregunta completamente separada. –

-4
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 
float luminance = dot(textureColor.rgb, W); 

mediump vec2 p = textureCoordinate; 
if (p.x == 0.2 && p.x<0.6 && p.y > 0.4 && p.y<0.6) { 
    gl_FragColor = vec4(textureColor.r * 1.0, textureColor.g * 1.0, textureColor.b * 1.0, textureColor.a); 
} else { 
    gl_FragColor = vec4(textureColor.r * 0.0, textureColor.g * 0.0, textureColor.b * 0.0, textureColor.a *0.0); 
} 
Cuestiones relacionadas