2011-01-26 32 views
5

我需要訪問並閱讀從網絡攝像機發送實時MJPEG素材的http流,以便對圖像執行一些opencv圖像處理。如何在C++中解析MJPEG HTTP Stream?

我可以通過VLC訪問攝像機的鏡頭,或者簡單地通過在Chrome或Firefox中訪問URL。但是,當服務器只是發送一個連續的feed時,如何以編程方式訪問http服務器並分離每個幀?

數據似乎是簡單的格式化,在HTTP標頭和JPEG數據之間循環。我能想到的解決這個問題的唯一方法是向服務器發送一個請求,解析數據並將其與實際的jpeg數據分離,然後將其傳遞給opencv。

但是,這聽起來非常令人費解,我不太確定我會從哪裏開始。你們知道有沒有圖書館,或只是我忽略了一個更簡單的方法,這可以使所有這些更容易?

非常感謝

回答

5

對於HTTP下載,你可以使用Libcurl庫。

AFAIK MJPEG格式不是標準格式。它的實際字節格式因實現而異。但基本上只是jpeg文件與分隔符的串接。如果您使用十六進制編輯器查看字節,則可以輕鬆區分每個jpeg文件。

例如,FFmpeg的MJPEG輸出的結構如下圖所示:

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 2016-12-29 08:33:56

1

在這個頁面:

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

解析一個MJPEG流與Java,我實現了這個與完美導致的Java 。

如果試圖++你會發現有些事情錯過了與C使用方法:插座連接如和渲染帆布,libcurl的似乎是一個很好的選擇,http請求,但仍然缺少畫布,你可以使用像GLUT或Qt的。

我在一些論壇上讀到,OpenCV可以讀取MJPEG Streamer類型的輸入流,但似乎他們需要成爲OpenCV的最新版本(從零開始編譯OpenCV很難)。

我希望這個幫助。

+0

我正在更新我的網站新網址是http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012- 05-13DisplayingStreamedMJPEGinJava.txt – shrub34 2015-06-27 12:52:02