2011-01-26 13 views
5

Necesito acceder y leer una secuencia http que está enviando metraje MJPEG en vivo desde una cámara de red, para hacer algo de procesamiento de imagen opencv en la imagen.Cómo analizar MJPEG HTTP Stream dentro de C++?

Puedo acceder a las imágenes de la cámara a través de VLC, o simplemente yendo a la URL en Chrome o Firefox. Pero, ¿cómo puedo acceder mediante programación al servidor http y separar cada fotograma, cuando el servidor solo está enviando un feed continuo?

Parece que los datos están simplemente formateados, formando un bucle entre el encabezado HTTP y los datos JPEG. La única forma en que puedo pensar en abordar esto es enviando una solicitud al servidor, analizando los datos tal como vienen, y separando el encabezado de los datos jpeg reales, y, a su vez, pasándolo a opencv.

Sin embargo, eso suena terriblemente complicado y no estoy muy seguro de dónde comenzaría. ¿Saben ustedes si hay bibliotecas por ahí, o simplemente un enfoque más simple que estoy pasando por alto, que podría hacer todo esto más fácil?

Gracias mucho

Respuesta

5

Para descarga HTTP, puede utilizar Libcurl biblioteca.

Formato AFAIK MJPEG no es un formato estandarizado. Su formato de bytes real varía según las implementaciones. Pero básicamente solo concatenación de archivos jpeg con delimitadores. Si miras los bytes con un editor hexadecimal, puedes distinguir fácilmente cada archivo jpeg.

Por ejemplo, la producción MJPEG de FFmpeg está estructurado como a continuación:

0xff 0xd8 // start of jpeg 
{ ... } // jpeg body 
0xff 0xd9 // end of jpeg 
... 
0xff 0xd8 // start of jpeg 
{ ... } // jpeg body 
0xff 0xd9 // end of jpeg 
... 
+0

https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure – user1742529

1

En esta página:

http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012-05-13DisplayingStreamedMJPEGinJava.txt

Analiza una secuencia MJPEG con Java, he implementado esto con la perfección resulta en Java .

Si intenta usar con C++, encontrará algunas cosas que omitió: conexión del socket y renderizado de canvas, libcurl parece ser una buena opción para la solicitud http, pero aún falta el lienzo, puede usar algo como GLUT o Qt.

Leo en algunos foros que OpenCV puede leer el flujo de entrada del tipo MJPEG Streamer, pero parece que necesitan ser la versión más reciente de OpenCV (compilar OpenCV desde cero es difícil).

Espero que esta ayuda.

+0

Estoy actualizando mi sitio URL nueva es http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012- 05-13DisplayarStreamedMJPEGinJava.txt – shrub34

Cuestiones relacionadas