c++ - 使用罗技C920采集H264到OpenCV

标签 c++ linux opencv

我一直在尝试使用 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 流式传输到我的本地主机 (127.0.0.1)。然后我再次使用 gstreamer 捕获它,并将其通过管道传输到我的虚拟 v4l2 视频设备,该设备是使用 gst-launch-0.10 中的“v4l2sink”选项通过环回制作的。 这个解决方案有效,我实际上可以使用 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 !解码箱! v4l2sink device=/dev/video4

或者事实上您知道我会在 opencv highgui 代码中更改什么以便能够直接从我的设备捕获 h264 而无需使用虚拟设备?那将是非常棒的!

这里是环回和我使用的 rtspserver 的链接:

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

对于奇怪的链接,我感到抱歉,我还没有足够的声誉来发布更多链接..

最佳答案

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

我将与您分享我的发现。

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

  • 可以使用 V4L2 API 以 30 FPS 的速度直接从相机读取 C920 h264 流(如果您尝试读取 YUYV 缓冲区,驱动程序从 USB 读取的速度限制为 10 fps、5 fps 或 2 fps ...)
  • 可以使用 OpenMax IL API 使用 raspberry 的 broadcom 芯片将流解码为 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
        ...
    }

关于c++ - 使用罗技C920采集H264到OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29907420/

相关文章:

c++ - Windows 受限用户安装

无法从多个 fifos 读取

iOS:OpenCV 红色范围

c++ - 姿势优化的高斯牛顿实现错误

python - OpenCV Python 检测多尺度

c++ - c/c++编译器如何知道错误在哪一行

c++ - 为什么staticMetaObject.className()返回的是父类的类名?

c++ - c++程序中的数据库连接检查

linux - 我如何学习为 Linux 编写字符设备驱动程序?

c++ - 如何在 VS Code 中获得注释智能感​​知