我需要访问和读取从网络摄像机发送实时MJPEG素材的http流,以便对图像进行一些opencv图像处理。
我可以通过VLC访问相机的镜头,或者只需转到chrome或firefox中的URL即可。但是,当服务器只发送连续数据时,如何以编程方式访问http服务器并分离每个帧?
数据似乎只是简单格式化,在HTTP标头和JPEG数据之间循环。我能想到接近这个的唯一方法是以某种方式向服务器发送请求,在数据进入时解析数据,并将标头与实际的jpeg数据分开,然后将其传递给opencv。
然而,这听起来非常复杂,我不太清楚我从哪里开始。你们知道那里有没有图书馆,或者只是一个我忽视的简单方法,这可以让这一切变得更容易吗?
非常感谢
答案 0 :(得分: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
...
答案 1 :(得分:1)
在此页面中:
使用Java解析MJPEG流,我在Java中实现了完美的结果。
如果您尝试使用C ++,您会发现一些错过的内容:套接字连接和渲染画布,libcurl似乎是http请求的一个很好的选择,但仍然缺少画布,您可以使用类似GLUT或Qt的东西。
我在一些论坛中读到OpenCV可以读取MJPEG Streamer类型的输入流,但似乎它们需要是最新版本的OpenCV(从头开始编译OpenCV很难)。
我希望这有帮助。