2012-07-17 77 views
12

我在linux上使用openCV(Ubuntu 12.04),我有一个Logitech c920,我想从中抓取图像。奶酪能够抓取高达分辨率的帧,但每当我尝试使用openCV时,我只能获得640x480的图像。我曾尝试:Linux上的OpenCV(通过python):设置帧的宽度/高度?

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) 

所得图像仍然是640×480。

我试着安装了似乎通过(蟒蛇外)进行相关的工具:

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

,我确实可以明显地操控相机的设置(再次,蟒蛇外)通过:

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壳,上面的代码(试图设置的属性,并获得图像即为640x480时印刷零)行为完全与以前相同。能够提高捕获的分辨率对我来说是非常重要的任务,所以我非常感谢任何人都可以提供的指针。

+0

我在与CV2同样的问题(OpenCV的2.4.2)。以前,它曾经工作得很好。 – Froyo 2012-07-17 14:52:54

+0

@Froyo:你有什么版本的opencv和ubuntu工作?我可能只是恢复我的系统得到这个工作... – 2012-07-18 14:16:12

+0

OpenCV 2.3.1和Ubuntu 11.10 – Froyo 2012-07-18 14:22:35

回答

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) 

这是一个有点哈克,因此预计崩溃。

+1

好主意,但没有运气。当我尝试os.system()调用时,我得到打印输出,说'VIDIOC_S_FMT:失败:设备或资源忙',这暗示当调用'cam = cv.CaptureFromCAM(-1)'时,opencv将相机锁定为资源,防止v4l2-ctl对其进行修改。 – 2012-07-17 13:15:50

+0

嗯,我应该预料到的东西......您可以尝试使用OpenCV代码,查看它发送给相机的命令以及应该发送的命令以便工作。这可能是因为OpenCV中的一个简单的单行更改将使其工作。 – Sam 2012-07-17 13:23:41

3

the docs

功能cvSetCaptureProperty设置视频采集的指定的属性。目前该功能仅支持视频文件:CV_CAP_PROP_POS_MSEC,CV_CAP_PROP_POS_FRAMES,CV_CAP_PROP_POS_AVI_RATIO。

注意:在FFMPEG上使用最新的CVS下载(如果使用0并返回0,函数内容将被隐藏),此函数当前不执行任何操作。

2

它似乎是由cammera变量。 AFIK,罗技相机有特别糟糕的Linux支持(虽然它变得更好)他们的大多数问题都与先进的功能,如焦点控制。我会建议坚持使用基本的相机(IE手动对焦罗技相机)只是为了安全起见。

我内置的笔记本电脑相机没有问题,并以正常分辨率显示。
我的外部Logitech专业版存在问题。

但是,我可以用这两行来克服解决方案的问题。

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

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

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

请确保您设置的分辨率是由您的相机支持,否则v4l会对您大吼。如果我设置了不受支持的本地分辨率,我没有成功。

0
## Sets up the camera to capture video 
cap = cv2.VideoCapture(device) 

宽度= 1280,高度= 720

#set the width and height 
cap.set(3,width) 
cap.set(4,height) 
3

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

#define DEFAULT_V4L_WIDTH 1920 
#define DEFAULT_V4L_HEIGHT 1080 

这是在Ubuntu 12.04的OpenCV 2.4.8

+1

也适用于OpenCV 3.0.0。 (在我的情况下,我将分辨率降低到320x240)。对于OpenCV 3.0,要编辑的文件已更改为'modules/videoio/src/cap_v4l.cpp'。 – 2015-08-18 19:45:05