13

我在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 的图像时打印零)。

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

4

5 回答 5

3

文档中,

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

NB 使用 FFMPEG 在 linux 上下载最新的 CVS 时,该函数目前没有任何作用(如果使用并返回 0,则隐藏函数内容)。

于 2012-07-26T08:25:32.847 回答
3

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

#define DEFAULT_V4L_WIDTH  1920
#define DEFAULT_V4L_HEIGHT 1080

这是针对 OpenCV 2.4.8

于 2014-03-10T16:04:27.887 回答
2

它似乎是可变的相机。

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)

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

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

于 2012-11-24T02:19:14.753 回答
1
## 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)
于 2013-12-19T13:32:48.363 回答
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,所以期待崩溃。

于 2012-07-17T12:51:41.753 回答