所以。一段时间以来,我一直在尝试让我的 Raspberry Pi 2 使用 OpenCV 从我的 Logitech C920 捕获 H264 流。我一直在互联网上搜寻信息,但没有运气。
简短的系统描述:
- Raspberry Pi 2,运行 Raspbian,内核 3.18
- 罗技 HD Pro 网络摄像头 c920
- OpenCV 2.4.11
- BonesCV - 归功于 Derek Molloy (https://github.com/derekmolloy/boneCV https://github.com/derekmolloy/boneCV)
- libx264 和 FFMPEG(内置 x264 支持)
- libv4l-dev、v4l-utils、qv4l2、v4l2ucp
我知道 OpenCV 强制格式为 BGR24 (MJPG)。这在中指定cap_libv4l.cpp https://github.com/Itseez/opencv/blob/2.4.11/modules/highgui/src/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 手动设置像素格式
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
您可以看到“像素格式”和“每行字节数”的变化。 “Field”保持为 None,“Colourspace”保持为 SRGB。
然后我尝试将 cap_lib4vl.cpp 中的每个“V4L2_PIX_FMT_BGR24”替换为“V4L2_PIX_FMT_H264”并重建 OpenCV。然后,当我运行“./boneCV”时,我的两个 .png 图像只是黑色,带有一两条白色条纹。
为了查明它是 libv4l 还是 OpenCV,我运行了遵循 Derek Molloys Bones 的“./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
与我手动设置所有内容时完全相同。
我得出的结论是,如果我希望 OpenCV 能够捕获原始 H264 流,我必须更改 cap_libv4l.cpp,但我不知道如何更改。我认为这可能是因为每帧位数和/或色彩空间的差异。有谁知道如何做到这一点或如何制定解决方法,以便我仍然可以使用 OpenCV 的“VideoCapture”功能?
我知道如果这个问题有任何解决方案,很多 Raspberry Pi 和 BeagleboneBlack 用户都会非常感激。
我已尽力涵盖我认为相关的所有内容,如果我还可以提供更多内容来更好地描绘图片,请说出来。
她提到的脚本和程序的一些链接:(编辑。我尝试发布每个程序的链接,但我没有足够的声誉。转到 Derek Molloys github 页面,你会在那里找到骨头CV。)
不,我不能使用“CV_FOURCC('H','2','6','4');”因为linux还没有实现这个功能。