我一直在尝试使用OpenCV(在Raspberry Pi 2上)从我的两台C920罗技相机中捕获H264流。我得出的结论是,这是不可能的,因为它尚未实施。我在OpenCV / modules / highgui / cap_libv4l.cpp中看了一下,发现“Videocapture-function”总是将pixelformat转换为BGR24。我试图将其更改为h264,但只有黑屏。我想这是因为它没有以正确的方式解码。
所以我使用以下方法进行了解决方法:
(你可以在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:
对于奇怪的链接,我还没有足够的声誉来提供更多链接,我们很抱歉..
答案 0 :(得分:2)
我不确定您在OpenCV中需要更改的确切位置,但是最近我开始在Raspberry PI上使用视频进行编码。
我将与您分享我的发现。
到目前为止,我已经知道了:
我的进行中代码位于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