【问题标题】:OpenCV (via python) on Linux: Set frame width/height?Linux 上的 OpenCV(通过 python):设置帧宽度/高度?
【发布时间】:2012-07-16 09:20:58
【问题描述】:

我在 linux (ubuntu 12.04) 上通过 python 使用 openCV,并且我有一个罗技 c920,我想从中获取图像。 Cheese 能够抓取非常高分辨率的帧,但每当我尝试使用 openCV 时,我只能得到 640x480 的图像。我试过了:

import cv
cam = cv.CaptureFromCAM(-1)
cv.SetCaptureProperty(cam,cv.CV_CAP_PROP_FRAME_WIDTH,1920)
cv.SetCaptureProperty(cam,cv.CV_CAP_PROP_FRAME_WIDTH,1080)

但这会在最后两行之后产生“0”的输出,当我随后通过以下方式抓取一帧时:

image = cv.QueryFrame(cam)

生成的图像仍然是 640x480。

我尝试通过(在 python 之外)安装似乎相关的工具:

sudo apt-get install libv4l-dev v4l-utils qv4l2 v4l2ucp

我确实可以通过以下方式操纵相机的设置(同样,在 python 之外):

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1
v4l2-ctl --set-parm=30

并观察:

v4l2-ctl -V

确实表明有些东西已经改变了:

Format Video Capture:
    Width/Height   : 1920/1080
    Pixel Format   : 'H264'
    Field          : None
    Bytes per Line : 3840
    Size Image     : 4147200
    Colorspace     : sRGB

但是当我进入 python shell 时,上述代码的行为与之前完全相同(尝试设置属性并获取 640x480 的图像时打印零)。

能够提高捕获的分辨率对我来说是非常关键的任务,所以我非常感谢任何人可以提供的任何指针。

【问题讨论】:

  • 我在 ubuntu 12.04 中遇到了与 cv2 (OpenCV 2.4.2) 相同的问题。以前,它可以正常工作。
  • @Froyo:你在哪个版本的 opencv 和 ubuntu 上工作过?我可能只是恢复我的系统以使其正常工作...
  • OpenCV 2.3.1 和 ubuntu 11.10
  • 我最近answered 有一个类似的问题,并认为答案也应该适合你。

标签: python linux opencv webcam v4l2


【解决方案1】:

不确定它是否有效,但您可以在实例化相机对象后尝试将参数强制为您的值:

import cv
cam = cv.CaptureFromCAM(-1)

os.system("v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1") 
os.system("v4l2-ctl --set-parm=30")

image = cv.QueryFrame(cam)

这有点 hacky,所以预计会崩溃。

【讨论】:

  • 好主意,但没有运气。当我尝试调用 os.system() 时,我得到了显示 VIDIOC_S_FMT: failed: Device or resource busy 的打印输出,这表明当调用 cam = cv.CaptureFromCAM(-1) 时,opencv 将相机锁定为资源,从而阻止 v4l2-ctl 对其进行修改。
  • hmmm,我应该预料到的事情......您可以尝试使用 OpenCV 代码,查看它发送到相机的命令,以及应该发送什么命令才能工作。可能在 OpenCV 中进行简单的一行更改即可使其工作。
【解决方案2】:

来自the docs

函数 cvSetCaptureProperty 设置视频捕获的指定属性。目前该功能仅支持视频文件:CV_CAP_PROP_POS_MSEC、CV_CAP_PROP_POS_FRAMES、CV_CAP_PROP_POS_AVI_RATIO。

NB 这个函数目前在linux上使用FFMPEG最新的CVS下载时什么都不做(如果使用0返回函数内容隐藏)。

【讨论】:

    【解决方案3】:

    它似乎是由相机可变的。

    AFIK,Logitech 相机对 Linux 的支持特别差(尽管它变得更好了)它们的大多数问题都与焦点控制等高级功能有关。为了安全起见,我建议坚持使用基本相机(即手动对焦罗技相机)。

    我的笔记本电脑内置摄像头没有问题,可以正常分辨率显示。
    我的外部罗技专业人士在初始化时遇到问题。

    但是,我可以通过这两行来克服分辨率问题。

    是的,它们与您使用的相同。

    cv.SetCaptureProperty(self.capture,cv.CV_CAP_PROP_FRAME_WIDTH, 1280)
    cv.SetCaptureProperty(self.capture,cv.CV_CAP_PROP_FRAME_HEIGHT, 720)
    

    我的 Logitech 仍然会抛出错误,但分辨率很好。

    请确保您设置的分辨率是您的相机支持的,否则 v4l 会对您大喊大叫。如果我设置了不受支持的本机分辨率,我的成功率为零。

    【讨论】:

      【解决方案4】:
      ## Sets up the camera to capture video
      cap = cv2.VideoCapture(device)
      
      width = 1280
      height = 720
      
      #set the width and height
      cap.set(3,width)
      cap.set(4,height)
      

      【讨论】:

        【解决方案5】:

        我和你有同样的问题。最终进入 OpenCV 源代码并更改 modules/highgui/src/cap_v4l.cpp 第 245-246 行中的默认参数并重建项目。

        #define DEFAULT_V4L_WIDTH  1920
        #define DEFAULT_V4L_HEIGHT 1080
        

        这适用于 OpenCV 2.4.8

        【讨论】:

        • 也适用于 OpenCV 3.0.0。 (在我的情况下,我将分辨率降低到 320x240。)对于 OpenCV 3.0,要编辑的文件已更改为 modules/videoio/src/cap_v4l.cpp
        猜你喜欢
        • 1970-01-01
        • 2019-12-30
        • 2012-04-14
        • 2011-09-03
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多