2011-01-26 15 views
5

Tôi cần truy cập và đọc một luồng http đang gửi cảnh MJPEG trực tiếp từ camera mạng, để thực hiện xử lý hình ảnh opencv trên hình ảnh.Làm cách nào để phân tích MJPEG HTTP Stream trong C++?

Tôi có thể truy cập cảnh quay của máy ảnh qua VLC hoặc đơn giản bằng cách truy cập URL trong chrome hoặc firefox. Nhưng làm thế nào tôi có thể truy cập chương trình máy chủ http và tách riêng từng khung hình, khi máy chủ chỉ gửi một nguồn cấp dữ liệu liên tục?

Dữ liệu có vẻ được định dạng đơn giản, lặp lại giữa dữ liệu Tiêu đề HTTP và JPEG. Cách duy nhất tôi có thể nghĩ đến việc tiếp cận điều này là bằng cách nào đó gửi yêu cầu tới máy chủ, phân tích cú pháp dữ liệu như nó đi vào, và tách tiêu đề khỏi dữ liệu jpeg thực tế, và, lần lượt, chuyển nó tới opencv.

Tuy nhiên, điều đó nghe có vẻ phức tạp và tôi không chắc chắn nơi tôi sẽ bắt đầu. Các bạn có biết nếu có bất kỳ thư viện nào ở đó không, hoặc chỉ là một cách tiếp cận đơn giản hơn tôi nhìn, điều đó có thể làm cho mọi thứ dễ dàng hơn?

Cảm ơn rất nhiều

Trả lời

5

Để tải xuống HTTP, bạn có thể sử dụng thư viện Libcurl.

Định dạng AFAIK MJPEG không phải là định dạng chuẩn. Định dạng byte thực tế của nó thay đổi theo cách triển khai. Nhưng về cơ bản chỉ ghép nối các tập tin jpeg với dấu phân tách. Nếu bạn nhìn vào các byte với trình chỉnh sửa hex, bạn có thể dễ dàng phân biệt từng tệp jpeg.

Ví dụ, sản lượng mjpeg ffmpeg được cấu trúc như sau:

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

Trong trang này:

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

Phân tích một Stream MJPEG với Java, tôi thực hiện điều này với một cách hoàn hảo kết quả trong Java .

Nếu bạn cố gắng sử dụng với C++, bạn tìm thấy một số điều bị bỏ qua: kết nối socket và render canvas, libcurl có vẻ là một lựa chọn tốt để yêu cầu http, nhưng vẫn thiếu canvas, bạn có thể sử dụng một cái gì đó như GLUT hoặc Qt.

Tôi đọc trong một số diễn đàn mà OpenCV có thể đọc luồng đầu vào của loại MJPEG Streamer, nhưng có vẻ như chúng cần phải là phiên bản OpenCV gần đây (biên dịch OpenCV từ đầu nó khó).

Tôi hy vọng sự trợ giúp này.

+0

Tôi đang cập nhật URL mới của trang web của mình là http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012- 05-13DisplayingStreamedMJPEGinJava.txt – shrub34