2011-01-26 6 views
5

Ho bisogno di accedere e leggere uno stream http che sta inviando filmati MJPEG dal vivo da una telecamera di rete, al fine di eseguire qualche elaborazione dell'immagine opencv sull'immagine.Come analizzare MJPEG HTTP Stream in C++?

Posso accedere al filmato della videocamera tramite VLC o semplicemente andando all'URL in chrome o firefox. Ma come posso accedere a livello di programmazione al server http e separare ogni frame, quando il server sta semplicemente inviando un feed continuo?

I dati sembrano essere semplicemente formattati, in loop tra i dati HTTP Header e JPEG. L'unico modo in cui posso pensare di avvicinarmi a questo è in qualche modo inviare una richiesta al server, analizzare i dati così come vengono e separare l'intestazione dai dati jpeg effettivi e, a sua volta, passarla a opencv.

Tuttavia, sembra terribilmente complicato e non sono abbastanza sicuro da dove iniziare. Ragazzi, sapete se ci sono biblioteche là fuori, o semplicemente un approccio più semplice che sto trascurando, che potrebbe rendere tutto più facile?

Grazie mille

risposta

5

Per il download HTTP, è possibile utilizzare Libcurl biblioteca.

AFAIK Il formato MJPEG non è un formato standard. Il suo formato di byte effettivo varia in base alle implementazioni. Ma fondamentalmente solo concatenazione di file jpeg con delimitatori. Se guardi i byte con un editor esadecimale, puoi facilmente distinguere ciascun file jpeg.

Per esempio, l'uscita MJPEG di ffmpeg è strutturato come di seguito:

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

In questa pagina:

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

Analizza una MJPEG Stream con Java, ho implementato questo con risultati perfettamente in Java .

Se si tenta di utilizzare con C++ a trovare alcune cose perse: presa conection e fare il rendering tela, libcurl sembra essere una buona opzione per richiesta http, ma ancora manca la tela, si può usare qualcosa come GLUT o Qt.

Ho letto in alcuni forum che OpenCV può leggere il flusso di input di tipo MJPEG Streamer, ma sembra che debbano essere la versione recente di OpenCV (compilare OpenCV da zero è difficile).

Spero che questo aiuto.

+0

Sto aggiornando il mio sito nuovo URL è http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012- 05-13DisplayingStreamedMJPEGinJava.txt – shrub34