¿Cómo analizo la transmisión de video en iOS?

Por ejemplo, hay escáneres QR que escanean la transmisión de video en time real y obtienen información de códigos QR. Me gustaría verificar la fuente de luz del video, si está encendido o apagado, es bastante potente, así que no hay problema.

Probablemente tome una transmisión de video como input, tal vez haga imágenes de ella y analice imágenes o transmita en time real la presencia de fuente de luz (¿tal vez número de píxeles de cierto color en la image?)

¿Cómo me acerco a este problema? ¿Tal vez hay alguna fuente de biblioteca?

Parece que estás pidiendo información sobre varios pasos discretos. Hay una multitud de forms de hacer cada uno de ellos y si te quedas atascado en cualquier paso individual sería una buena idea publicar una pregunta al respecto de forma individual.

1: get el marco de video

Como chaitanya.varanasi dijo, AVFoundation Framework es la mejor manera de get acceso a un marco de video en IOS. Si quiere algo less flexible y rápido, intente search la captura de video de CV abierta. El objective de este paso es get acceso a un búfer de píxeles de la camera. Si tienes problemas con esto, pregúntalo específicamente.

2: coloque el búfer de píxeles en OpenCV

Esta parte es muy fácil. Si lo obtienes de la captura de video de openCV, ya has terminado. Si lo obtienes de una AVFoundation, tendrás que ponerlo en openCV como este

//Buffer is of type CVImageBufferRef, which is what AVFoundation should be giving you //I assume it is BGRA or RGBA formatted, if it isn't, change CV_8UC4 to the appropriate format CVPixelBufferLockBaseAddress( Buffer, 0 ); int bufferWidth = CVPixelBufferGetWidth(Buffer); int bufferHeight = CVPixelBufferGetHeight(Buffer); unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(Buffer); cv::Mat image = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel); //put buffer in open cv, no memory copied //Process image Here //End processing CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 ); 

tenga en count Estoy asumiendo que planeas hacer esto en OpenCV desde que usaste su label. También supongo que puede hacer que el marco OpenCV se vincule a su proyecto. Si eso es un problema, haga una pregunta específica al respecto.

3: image del process

Esta parte es, con mucho, la más abierta. Todo lo que has dicho sobre tu problema es que estás tratando de detectar una fuente de luz fuerte. Una forma muy rápida y fácil de hacerlo sería detectar el valor medio de píxeles en una image en escala de grises. Si obtiene la image en color, puede convertirla con cvtColor . Luego, simplemente click Avg para get el valor medio. Con suerte, puedes saber si la luz está encendida por cómo fluctúa ese valor.

chaitanya.varanasi sugirió otra opción, también debes echarle un vistazo.

openCV es una biblioteca muy grande que puede hacer una gran variedad de cosas. Sin saber más sobre su problema, no sé qué más decirle.

Mira el AVFoundation Framework de Apple.

¡Espero eso ayude!

Puede probar este método: comience por get todas las imágenes en un AVCaptureVideoDataOutput . Del método: captureOutput:didOutputSampleBuffer:fromConnection , puede muestrear / calcular cada píxel. Fuente: respuesta

Además, puedes echar un vistazo a esta pregunta SO donde verifican si un píxel es negro. Si es una fuente de luz tan poderosa, puede tomar el inverso del píxel y luego determinar usando un umbral establecido para negro.

El código de muestra anterior solo proporciona acceso a los valores de píxeles almacenados en el búfer; no puede ejecutar ningún otro command sino aquellos que cambian esos valores pixel por píxel:

 for ( uint32_t y = 0; y < height; y++ ) { for ( uint32_t x = 0; x < width; x++ ) { bgraImage.at<cv::Vec<uint8_t,4> >(y,x)[1] = 0; } } 

Esto, para usar su ejemplo, no funcionará con el código que proporcionó:

  cv::Mat bgraImage = cv::Mat( (int)height, (int)extendedWidth, CV_8UC4, base ); cv::Mat grey = bgraImage.clone(); cv::cvtColor(grey, grey, 44);