【问题标题】:Capturing H264 with logitech C920 to OpenCV使用罗技 C920 将 H264 捕获到 OpenCV
【发布时间】:2015-04-27 22:58:31
【问题描述】:

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

所以我做了一个解决方法:

  • V4l2环回
  • 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 视频设备。 该解决方案有效,我实际上可以使用 opencv videocapture 连接到虚拟设备并获得全高清图片而不会使 cpu 过载,但这远不是一个足够好的解决方案。我得到了大约 3 秒的延迟,这对于我的立体视觉应用来说太高了,而且它使用了大量的带宽。

所以我想知道是否有人知道我可以使用 Derek Molloys boneCV/capture 程序中的 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

抱歉,我还没有足够的声誉发布更多链接。

【问题讨论】:

标签: c++ linux opencv


【解决方案1】:

我不确切知道您需要在 OpenCV 中进行哪些更改,但最近我开始在 Raspberry PI 上使用视频进行编码。

我会和你分享我的发现。

到目前为止我得到了这个:

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

我的工作进度代码位于:GitHub

对代码组织感到抱歉。但我认为我所做的抽象比普通的 V4L2 或 OpenMAX 代码更具可读性。

一些代码示例:

使用 V4L2 Wrapper 读取相机 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();

使用 OpenMax IL 解码 h264:

     BroadcomVideoDecode decoder;
     while (!exit_requested) {
        //capture code start
        ...
        //decoding code
        decoder.writeH264Buffer(bufferPtr[bufferQueue.index],bufferQueue.bytesused);
        //capture code end
        ...
    }

【讨论】:

    【解决方案2】:

    在 youtube 上查看 Derek Molloy。他正在使用 Beaglebone,但大概勾选了这个框 https://www.youtube.com/watch?v=8QouvYMfmQo

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2023-03-22
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多