所以 . 我一直试图让我的Raspberry Pi 2用我的Logitech C920用OpenCV捕获H264流已经有一段时间了 . 我一直在搜索互联网信息,但没有运气 .

一个简短的系统描述:

  • Raspberry Pi 2,运行Raspbian,内核3.18

  • 罗技HD Pro网络摄像头c920

  • OpenCV 2.4.11

  • boneCV - Derek Molloy的致谢(https://github.com/derekmolloy/boneCV

  • libx264和FFMPEG(内置x264支持)

  • libv4l-dev,v4l-utils,qv4l2,v4l2ucp

我知道OpenCV强制格式为BGR24(MJPG) . 这在cap_libv4l.cpp中指定 . 它看起来像这样(第692行 - >):

/* libv4l will convert from any format to V4L2_PIX_FMT_BGR24 */
  CLEAR (capture->form);
  capture->form.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  capture->form.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
  capture->form.fmt.pix.field       = V4L2_FIELD_ANY;
  capture->form.fmt.pix.width = capture->width;
  capture->form.fmt.pix.height = capture->height;

我可以使用v4l2-ctl -set-fmt-video手动设置pixelformat

pi@raspberrypi ~/boneCV$ v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=H264
pi@raspberrypi ~/boneCV$ v4l2-ctl --get-fmt-video
Format Video Capture:
        Width/Height  : 1920/1080
        Pixel Format  : 'H264'
        Field         : None
        Bytes per Line: 3840
        Size Image    : 4147200
        Colotspace    : SRGB

如果我现在运行“./boneCV” - 一个非常简单的捕获程序,捕获图片并进行精确的边缘检测 . (我最后会添加代码) . 我明白了:

pi@raspberrypi ~/boneCV$ ./boneCV
pi@raspberrypi ~/boneCV$ v4l2-ctl --get-fmt-video
Format Video Capture:
        Width/Height  : 1920/1080
        Pixel Format  : 'MJPG'
        Field         : None
        Bytes per Line: 0
        Size Image    : 4147200
        Colorspace    : SRGB

您可以选择“Pixelformat”和“每行字节数”更改 . “Field”保持为None,“Colourspace”保持在SRGB . 然后我尝试将每个“V4L2_PIX_FMT_BGR24”替换为cap_lib4vl.cpp中的“V4L2_PIX_FMT_H264”并重新构建OpenCV . 当我运行“./boneCV”时,我的两个.png图像只有黑色,带有一条或两条白色条纹 .

为了确定它是libv4l还是OpenCV,我运行了跟随Derek Molloys boneCV的“./capture”脚本 . 它直接使用libv4l并捕获H264视频流,完全没有问题 . 然后我必须使用“./raw2mpg4”才能观看它 . .mp4文件是1920x1080,30 fps,没有毛刺 . 在此之后我再次检查了“v4l2-ctl --get-fmt-video”并得到了这个:

pi@raspberrypi ~/boneCV$ v4l2-ctl --get-fmt-video
Format Video Capture:
        Width/Height  : 1920/1080
        Pixel Format  : 'H264'
        Field         : None
        Bytes per Line: 3840
        Size Image    : 4147200
        Colotspace    : SRGB

完全一样,当我设置一切manualy .

我得出的结论是,如果我希望OpenCV能够捕获原始H264流,我将不得不更改cap_libv4l.cpp,但我不知道如何 . 我想这可能是因为每帧和/或颜色空间的比特差异 . Do anybody know how to do this or how to make an workaround so that I stil can use OpenCVs "VideoCapture" function?

我知道很多Raspberry Pi和BeagleboneBlack的用户如果对这个问题有任何解决方案会非常感激 . 我试图涵盖我认为相关的所有内容,如果我能提供更多的东西来更好地描绘图片,请说出来 .

她与上述脚本和程序的一些链接: (edit. I tried to post the links to each of the programs, but I didn't have enough reputation. Go to Derek Molloys github page and you'll find boneCV there.)

不,我不能使用“CV_FOURCC('H','2','6','4');”因为这个功能还没有为linux实现 .