如何结合gstreamer和opencv?

时间:2012-09-08 22:17:08

标签: python opencv gstreamer

我想使用OpenCV分析从网络摄像头拍摄的(部分)帧,其原始分辨率为1280乘960.我可以使用Gstreamer和appsink捕获这些帧。然而,我开始意识到,仅仅导入OpenCV会使Gstreamer混乱,这样我的捕获就不再起作用了。 我需要gstreamer,因为OpenCV只允许捕获640x480,我开始喜欢它带来的所有额外功能。

我能想到的最简单的例子就是:

    import gst
    from time import sleep

    #import cv2

    pipeline = gst.Pipeline()
    bin = gst.parse_bin_from_description('''
    autovideosrc !
    video/x-raw-rgb, width=1280, height=960 !
    ffmpegcolorspace !
    xvimagesink
    ''', False)
    pipeline.add(bin)

    pipeline.set_state(gst.STATE_PLAYING)

    while True:
        sleep(1)

在上面的版本中,它运行得很好,如果我取消注释import cv2语句,它会给我无休止的错误消息:

libv4l2:错误得到4个连续帧解码错误,最后一个错误:v4l-convert:错误无法枚举frameival index:6 for:RGB3 1280x960使用src:MJPG 1280x960,错误:参数无效

我在Kubuntu Linux 12.04上,使用OpenCV版本2.4.1,Gstreamer版本0.10.36

openCV做了什么来扰乱我的Gstreamer? 我怎样才能同时使用它们?

4 个答案:

答案 0 :(得分:1)

问题可能是gstreamer坏插件已经有了opencv。因此,您的opencv安装可能与gstreamer期望的版本冲突。

如果您希望gstreamer在其构建中启用opencv,请确保先安装opencv然后安装gstreamer。如果你不想这样做反过来。

答案 1 :(得分:0)

找到了解决方法:

如果我在设置Gstreamer管道后懒洋洋地导入OpenCV,OpenCV和Gstreamer可以很好地协同工作。

(在上面的示例中,对应于在'pipeline.add(bin)'之后移动'import cv2'语句)

但这不是我喜欢的答案。

答案 2 :(得分:0)

另外,我建议您将openCV处理改装为gstreamer插件,然后才能正确安排。

答案 3 :(得分:0)

或者,OpenCV(2.4.x或更高版本)可以打开GStreamer管道。有关示例,请参阅Using custom camera in OpenCV (via GStreamer)

OpenCV 3.0(开发分支)与GStreamer 1.0集成。