2012-07-17 70 views
12

Estoy usando openCV a través de python en Linux (ubuntu 12.04), y tengo un logitech c920 del cual me gustaría obtener imágenes. Cheese es capaz de capturar marcos hasta resoluciones realmente altas, pero cada vez que trato de usar openCV, solo obtengo imágenes de 640x480. He tratado:OpenCV (vía python) en Linux: ¿Establecer ancho/alto de cuadro?

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) 

pero esto produce salida de "0", después de cada una de las dos últimas líneas, y cuando posteriormente I agarrar un marco a través de:

image = cv.QueryFrame(cam) 

La imagen resultante es todavía 640x480.

He intentado instalar lo que parecía ser herramientas relacionadas con la vía (fuera del pitón):

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

y puedo de hecho aparentemente manipular los ajustes de la cámara (de nuevo, fuera del pitón) a través de:

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

y observar que:

v4l2-ctl -V 

hecho sugiere que algo tiene ha cambiado:

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

Pero cuando me pop en la cáscara del pitón, el código anterior se comporta exactamente igual que antes (ceros de impresión cuando se trata de establecer las propiedades y la obtención de una imagen que es de 640x480).

Ser capaz de aumentar la resolución de la captura es bastante crítico para mí, por lo que agradecería cualquier apuntador que cualquiera pueda proporcionar.

+0

estoy teniendo el mismo problema con CV2 (OpenCV 2.4.2) en Ubuntu 12.04. Anteriormente, solía funcionar bien. – Froyo

+0

@Froyo: ¿En qué versiones de opencv y ubuntu trabajaste? Podría revertir mi sistema para que funcione ... –

+0

OpenCV 2.3.1 y ubuntu 11.10 – Froyo

Respuesta

1

No estoy seguro si funciona, pero se puede tratar de forzar a los parámetros a sus valores después de crear una instancia de objeto de cámara:

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) 

que es un poco hacky, por lo que esperan un accidente.

+1

Buena idea, pero no hubo suerte. Cuando pruebo las llamadas a os.system(), obtengo una impresión que dice 'VIDIOC_S_FMT: error: dispositivo o recurso ocupado', lo que me sugiere que cuando se llame a' cam = cv.CaptureFromCAM (-1) ', opencv bloquea la cámara como un recurso, evitando que v4l2-ctl la modifique. –

+0

hmmm, algo que debería haber esperado ... Puede intentar trabajar con código OpenCV, ver qué comandos envía a la cámara y qué comando debe enviarse para funcionar. Es posible que un simple cambio de una línea en OpenCV lo haga funcionar. – Sam

3

De the docs,

La función cvSetCaptureProperty establece la propiedad especificada de captura de vídeo. Actualmente, la función solo admite archivos de video: CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO.

NB Esta función actualmente no hace nada cuando se usa la última descarga de CVS en Linux con FFMPEG (los contenidos de la función están ocultos si se usa 0 y se devuelve).

2

Parece ser variable por cammera.

AFIK, las cámaras de Logitech tienen un soporte de Linux especialmente malo (aunque ha mejorado) La mayoría de sus problemas son con funciones avanzadas como el control de foco. Aconsejaría seguir con las cámaras básicas (por ejemplo, las cámaras Logitech con enfoque manual de IE) solo para ir a lo seguro.

Mi cámara incorporada para computadora portátil no tiene ningún problema y se muestra con una resolución normal.
Mi Logitech Pro externo tiene problemas para la integración.

Sin embargo, puedo superar el problema de resolución con estas dos líneas.

Sí, son las mismas que usted usó.

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

My Logitech todavía arroja errores, pero la resolución está bien.

Asegúrate de que la resolución que establezcas sea compatible con tu cámara o v4l te gritará. Si configuro una resolución nativa no compatible, no tengo éxito.

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

width = 1.280, altura = 720

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

Yo tenía el mismo problema que tú. Finalizó yendo a la fuente de OpenCV y cambiando los parámetros predeterminados en modules/highgui/src/cap_v4l.cpp, líneas 245-246 y reconstruyendo el proyecto.

#define DEFAULT_V4L_WIDTH 1920 
#define DEFAULT_V4L_HEIGHT 1080 

Esto es para OpenCV 2.4.8

+1

También funciona para OpenCV 3.0.0. (Reduje la resolución a 320x240 en mi caso.) El archivo para editar ha cambiado a 'modules/videoio/src/cap_v4l.cpp' para OpenCV 3.0. –