2011-01-26 14 views
5

Potrzebuję uzyskać dostęp i czytać strumień http, który przesyła na żywo materiał MJPEG z kamery sieciowej, aby wykonać przetwarzanie obrazu opencv na obrazie.Jak analizować strumień HTTP MJPEG w C++?

Mogę uzyskać dostęp do materiału z kamery przez VLC, lub po prostu przechodząc do adresu URL w chrome lub firefox. Ale jak mogę programowo uzyskać dostęp do serwera http i oddzielić każdą ramkę, gdy serwer wysyła tylko ciągły kanał?

Dane wydają się być po prostu sformatowane, przechodząc między nagłówkiem HTTP a danymi JPEG. Jedynym sposobem, w jaki mogę się do tego przyzwyczaić, jest wysłanie zapytania do serwera, przeanalizowanie danych przychodzących i odseparowanie nagłówka od rzeczywistych danych jpeg, a następnie przekazanie tego do opencv.

Jednak to brzmi okropnie zwinnie i nie jestem do końca pewien, od czego zacząć. Czy wiecie, czy istnieją jakieś biblioteki, czy po prostu prostsze podejście, które przeoczyłem, które może to wszystko ułatwić?

dziękuję

Odpowiedz

5

Do pobrania HTTP, można użyć Libcurl bibliotekę.

Format AFAIK MJPEG nie jest standardowym formatem. Jego rzeczywisty format bajtów zależy od implementacji. Ale w zasadzie po prostu łączenie pliku jpeg z ogranicznikami. Jeśli spojrzysz na bajty za pomocą edytora szesnastkowego, możesz łatwo odróżnić każdy plik jpeg.

Na przykład, wyjście MJPEG FFmpeg jest skonstruowany jak poniżej:

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

Na tej stronie:

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

analizowania MJPEG Stream z Java, I wdrożone to z bezbłędnie wyniki w Javie .

Jeśli spróbujesz użyć w C++, zauważysz pewne rzeczy, które nie zostały spełnione: konektor gniazda i płótno renderowania, libcurl wydaje się być dobrą opcją dla żądania http, ale wciąż brakuje obrazu, możesz użyć czegoś takiego jak GLUT lub Qt.

Przeczytałem na niektórych forach, że OpenCV może odczytywać strumień wejściowy typu MJPEG Streamer, ale wydaje się, że musi to być ostatnia wersja OpenCV (kompilacja OpenCV od zera jest trudna).

Mam nadzieję, że ta pomoc.

+0

Aktualizuję witrynę pod nowym adresem http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012- 05-13DisplayingStreamedMJPEGinJava.txt – shrub34