2012-07-17 72 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