使用Logitech C920捕获H264到OpenCV

时间:2015-04-27 22:58:32

标签: c++ linux opencv

我一直在尝试使用OpenCV(在Raspberry Pi 2上)从我的两台C920罗技相机中捕获H264流。我得出的结论是,这是不可能的,因为它尚未实施。我在OpenCV / modules / highgui / cap_libv4l.cpp中看了一下,发现“Videocapture-function”总是将pixelformat转换为BGR24。我试图将其更改为h264,但只有黑屏。我想这是因为它没有以正确的方式解码。

所以我使用以下方法进行了解决方法:

  • V4l2loopback
  • h264_v4l2_rtspserver
  • 的Gstreamer-0.10

(你可以在github上找到loopback和rtspserver) 首先,我使用v4l2loopback设置虚拟设备。然后rtspserver在h264中捕获,然后将rtsp流式传输到我的localhost(127.0.0.1)。然后我用gstreamer再次捕获它,并使用gst-launch-0.10中的“v4l2sink”选项将其传输到我的虚拟v4l2视频设备,该设备由loopback制作。 这个解决方案有效,我实际上可以通过opencv视频捕获连接到虚拟设备并获得全高清图片而不会使CPU过载,但这远不是一个足够好的解决方案。我得到大约3秒的延迟,这对于我的立体视觉应用来说太高了,它使用了大量的带宽。

所以我想知道是否有人知道我可以使用来自Derek Molloys boneCV /捕获程序(我知道有效)的v4l2捕获程序来捕获h264,然后可能将其传输到gst-launche-0.10然后再次将它管道到我的虚拟设备的v4l2sink? (您可以在此处找到捕获程序:https://github.com/derekmolloy/boneCV

我使用的gstreamer命令是:

gst-launch-0.10 rtspsrc location=rtsp://admin:pi@127.0.0.1:8554/unicast ! decodebin ! v4l2sink device=/dev/video4

或者实际上你知道我会在opencv highgui代码中改变什么才能直接从我的设备捕获h264而不必使用虚拟设备?那真是太棒了!

以下是环回的链接和我使用的rtspserver:

  • github.com/mpromonet/h264_v4l2_rtspserver
  • github.com/umlaeute/v4l2loopback

对于奇怪的链接,我还没有足够的声誉来提供更多链接,我们很抱歉..

2 个答案:

答案 0 :(得分:2)

我不确定您在OpenCV中需要更改的确切位置,但是最近我开始在Raspberry PI上使用视频进行编码。

我将与您分享我的发现。

到目前为止,我已经知道了:

  • 可以使用V4L2 API以30 FPS的速度直接从相机读取C920 h264流(如果尝试读取YUYV缓冲区,则驱动程序的USB限制为10 fps,5 fps或2 fps ...)
  • 可以使用OpenMax IL API使用覆盆子的Broadcom芯片将流解码到YUV 4:2:0缓冲区

我的进行中代码位于GitHub

对不起,代码组织。但是我认为我所做的抽象比普通的V4L2或OpenMAX代码更具可读性。

一些代码示例:

使用V4L2包装器读取相机h264:

userSchema

使用OpenMax IL解码h264:

    device.streamON();
    v4l2_buffer bufferQueue;
    while (!exit_requested){
        //capture code
        device.dequeueBuffer(&bufferQueue);
        // use the h264 buffer inside bufferPtr[bufferQueue.index]
        ...
        device.queueBuffer(bufferQueue.index, &bufferQueue);
    }
    device.streamOFF();

答案 1 :(得分:0)

在youtube上查看Derek Molloy。他正在使用Beaglebone,但可能在此方框中打勾 https://www.youtube.com/watch?v=8QouvYMfmQo