tutorial releases para org descargar c image opencv webcam resolutions

releases - Incrementando la resolución de captura de la cámara en OpenCV



opencv org releases html (15)

cvSetCaptureProperty (captura, CV_CAP_PROP_FRAME_WIDTH, WIDTH);

cvSetCaptureProperty (captura, CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);

cvQueryFrame (captura);

Eso no funcionará con OpenCV 2.2, pero si usa OpenCV 2.1 funcionará bien.

En mi programa C / C ++, estoy usando OpenCV para capturar imágenes de mi cámara web. La cámara ( Logitech QuickCam IM ) puede capturar a resoluciones de 320x240 , 640x480 y 1280x960 . Pero, por alguna extraña razón, OpenCV me da imágenes de resolución de 320x240 solamente. Las llamadas para cambiar la resolución usando cvSetCaptureProperty () con otros valores de resolución simplemente no funcionan. ¿Cómo capturo imágenes con las otras resoluciones posibles con mi cámara web?


¡Solo una información que podría ser valiosa para las personas que tienen dificultades para cambiar la resolución de captura predeterminada (640 x 480)! Experimenté un problema así con opencv 2.4.x y una cámara Logitech ... ¡y encontré una solución!

El comportamiento que detecté es que el formato predeterminado se configura como parámetros iniciales cuando se inicia la captura de la cámara (cvCreateCameraCapture), y todos solicitan cambiar la altura o el ancho:

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, ...

o

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, ...

no son posibles después! ¡Efectivamente, descubrí al agregar el error de retorno de las funciones ioctl que el controlador V4L2 está devolviendo EBUSY para las solicitudes! Por lo tanto, una solución alternativa debería ser cambiar el valor predeterminado directamente en highgui / cap_v4l.cpp:

*#define DEFAULT_V4L_WIDTH 1280 // Originally 640* *#define DEFAULT_V4L_HEIGHT 720 // Originally 480*

Después de eso, acabo de volver a compilar opencv ... ¡y llegué para obtener 1280 x 720 sin ningún problema! Por supuesto, una solución mejor debería ser detener la adquisición, cambiar los parámetros y reiniciar la transmisión más tarde, ¡pero no estoy lo suficientemente familiarizado con opencv para hacerlo!

Espero que ayude

Michel BEGEY


Consulte este ticket: https://code.ros.org/trac/opencv/ticket/376

"La solución es usar el nuevo envoltorio basado en libv4l.

  1. instalar libv4l-dev (así es como se llama en Ubuntu)

  2. vuelva a ejecutar cmake, verá "V4L / V4L2: utilizando libv4l"

  3. volver a ejecutar ahora la resolución puede ser cambiada. probado con isight incorporado en MBP ".

Esto lo solucionó para mí usando Ubuntu y también podría funcionar para ti.


El código finalmente funcionó en Python una vez que Aaron Haun señaló que necesitaba definir los argumentos de la función establecer antes de usarlos.

#Camera_Get_Set.py #By Forrest L. Erickson of VRX Company Inc. 8-31-12. #Opens the camera and reads and reports the settings. #Then tries to set for higher resolution. #Workes with Logitech C525 for resolutions 960 by 720 and 1600 by 896 import cv2.cv as cv import numpy CV_CAP_PROP_POS_MSEC = 0 CV_CAP_PROP_POS_FRAMES = 1 CV_CAP_PROP_POS_AVI_RATIO = 2 CV_CAP_PROP_FRAME_WIDTH = 3 CV_CAP_PROP_FRAME_HEIGHT = 4 CV_CAP_PROP_FPS = 5 CV_CAP_PROP_POS_FOURCC = 6 CV_CAP_PROP_POS_FRAME_COUNT = 7 CV_CAP_PROP_BRIGHTNESS = 8 CV_CAP_PROP_CONTRAST = 9 CV_CAP_PROP_SATURATION = 10 CV_CAP_PROP_HUE = 11 CV_CAPTURE_PROPERTIES = tuple({ CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO, CV_CAP_PROP_FRAME_WIDTH, CV_CAP_PROP_FRAME_HEIGHT, CV_CAP_PROP_FPS, CV_CAP_PROP_POS_FOURCC, CV_CAP_PROP_POS_FRAME_COUNT, CV_CAP_PROP_BRIGHTNESS, CV_CAP_PROP_CONTRAST, CV_CAP_PROP_SATURATION, CV_CAP_PROP_HUE}) CV_CAPTURE_PROPERTIES_NAMES = [ "CV_CAP_PROP_POS_MSEC", "CV_CAP_PROP_POS_FRAMES", "CV_CAP_PROP_POS_AVI_RATIO", "CV_CAP_PROP_FRAME_WIDTH", "CV_CAP_PROP_FRAME_HEIGHT", "CV_CAP_PROP_FPS", "CV_CAP_PROP_POS_FOURCC", "CV_CAP_PROP_POS_FRAME_COUNT", "CV_CAP_PROP_BRIGHTNESS", "CV_CAP_PROP_CONTRAST", "CV_CAP_PROP_SATURATION", "CV_CAP_PROP_HUE"] capture = cv.CaptureFromCAM(0) print ("/nCamera properties before query of frame.") for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)): # camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo] foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i]) camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo] # print str(camera_values) print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo) print ("/nOpen a window for display of image") cv.NamedWindow("Camera", 1) while True: img = cv.QueryFrame(capture) cv.ShowImage("Camera", img) if cv.WaitKey(10) == 27: break cv.DestroyWindow("Camera") #cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1024) #cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 768) cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1600) cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 896) print ("/nCamera properties after query and display of frame.") for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)): # camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo] foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i]) camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo] # print str(camera_values) print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo) print ("/nOpen a window for display of image") cv.NamedWindow("Camera", 1) while True: img = cv.QueryFrame(capture) cv.ShowImage("Camera", img) if cv.WaitKey(10) == 27: break cv.DestroyWindow("Camera")



Encuentro que en Windows (de Win98 a WinXP SP3), OpenCV suele usar la biblioteca VFW de Microsoft para acceder a la cámara. El problema con esto es que a menudo es muy lento (por ejemplo, una captura máxima de 15 FPS) y con errores (de ahí que cvSetCaptureProperty a menudo no funcione). Afortunadamente, generalmente puede cambiar la resolución en otro software (particularmente "AMCAP", que es un programa de demostración que está fácilmente disponible) y afectará la resolución que utilizará OpenCV. Por ejemplo, puede ejecutar AMCAP para establecer la resolución en 640x480, y luego OpenCV la usará de manera predeterminada a partir de ese punto en adelante.

Pero si puede usar una biblioteca de acceso a cámara de Windows diferente, como la biblioteca "videoInput" http://muonics.net/school/spring05/videoInput/ que accede a la cámara utilizando DirectShow muy eficiente (parte de DirectX). O si tiene una cámara de calidad profesional, a menudo viene con una API personalizada que le permite acceder a la cámara, y puede usarla para acceder rápidamente con la capacidad de cambiar la resolución y muchas otras cosas.


Estoy publicando esto para asegurarme de que nadie más pierda el tiempo en esta función de propiedad de conjunto. Pasé 2 días en esto para ver que nada parece estar funcionando. Así que saqué el código (había instalado la biblioteca la primera vez). Esto es lo que sucede en realidad: cvSetCaptureProperty, llama a setProperty dentro de la clase CvCapture y lo behold setProperty no hace nada. Simplemente devuelve falso. En cambio, retomaré el uso de otra biblioteca para alimentar a OpenCV con un video / imágenes de captura. Estoy usando OpenCV 2.2


Estoy usando debian y ubuntu, tuve el mismo problema, no pude cambiar la resolución de la entrada de video usando CV_CAP_PROP_FRAME_WIDTH y CV_CAP_PROP_FRAME_HEIGHT

Resulté que la razón era una biblioteca perdida. ¡Instalé lib4l-dev a través de Synaptic, reconstruí OpenCV y el problema está RESUELTO!


Estoy usando openCV 1.1pre1 en Windows (la biblioteca de entrada de video se utiliza de forma predeterminada en esta versión de openCv en Windows).

Con estas instrucciones puedo configurar la resolución de la cámara. Tenga en cuenta que llamo al viejo cvCreateCameraCapture en lugar de cvCaptureFromCam.

capture = cvCreateCameraCapture(cameraIndex); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 ); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 ); videoFrame = cvQueryFrame(capture);

Lo he probado con las webcams Logitech, Trust y Philips


He hecho el procesamiento de imágenes en Linux antes y salté la funcionalidad incorporada de la cámara de OpenCV porque es (como habrás descubierto) incompleto.

Dependiendo de su sistema operativo, puede tener más suerte yendo directamente al hardware a través de los canales normales en lugar de hacerlo a través de openCV. Si está utilizando Linux, video4linux o video4linux2 deberían darle acceso relativamente trivial a las cámaras web USB y puede usar libavc1394 para firewire. Dependiendo del dispositivo y la calidad del código de ejemplo que sigas, deberías poder ejecutar el dispositivo con los parámetros que deseas en una o dos horas.

Editado para agregar: Estás solo si es Windows. Me imagino que no es mucho más difícil, pero nunca lo he hecho.


No parece haber una solución. La resolución puede aumentarse a 640x480 usando este hack compartido por lifebelt77 . Aquí están los detalles reproducidos:

Agregar a highgui.h :

#define CV_CAP_PROP_DIALOG_DISPLAY 8 #define CV_CAP_PROP_DIALOG_FORMAT 9 #define CV_CAP_PROP_DIALOG_SOURCE 10 #define CV_CAP_PROP_DIALOG_COMPRESSION 11 #define CV_CAP_PROP_FRAME_WIDTH_HEIGHT 12

Agregue la función icvSetPropertyCAM_VFW a cvcap.cpp :

static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int property_id, double value ) { int result = -1; CAPSTATUS capstat; CAPTUREPARMS capparam; BITMAPINFO btmp; switch( property_id ) { case CV_CAP_PROP_DIALOG_DISPLAY: result = capDlgVideoDisplay(capture->capWnd); //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEODISPLAY,0,0); break; case CV_CAP_PROP_DIALOG_FORMAT: result = capDlgVideoFormat(capture->capWnd); //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOFORMAT,0,0); break; case CV_CAP_PROP_DIALOG_SOURCE: result = capDlgVideoSource(capture->capWnd); //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOSOURCE,0,0); break; case CV_CAP_PROP_DIALOG_COMPRESSION: result = capDlgVideoCompression(capture->capWnd); break; case CV_CAP_PROP_FRAME_WIDTH_HEIGHT: capGetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO)); btmp.bmiHeader.biWidth = floor(value/1000); btmp.bmiHeader.biHeight = value-floor(value/1000)*1000; btmp.bmiHeader.biSizeImage = btmp.bmiHeader.biHeight * btmp.bmiHeader.biWidth * btmp.bmiHeader.biPlanes * btmp.bmiHeader.biBitCount / 8; capSetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO)); break; default: break; } return result; }

y edite la capturaCAM_VFW_vtable de la siguiente manera:

static CvCaptureVTable captureCAM_VFW_vtable = { 6, (CvCaptureCloseFunc)icvCloseCAM_VFW, (CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW, (CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW, (CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW, (CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // was NULL (CvCaptureGetDescriptionFunc)0 };

Ahora reconstruido highgui.dll .


Prueba esto:

capture = cvCreateCameraCapture(-1); //set resolution cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, frameWidth); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, frameHeight);


Recomiendo utilizar VideoInput lib , es compatible con cualquier dispositivo DirectShow (incluso con varios dispositivos al mismo tiempo) y es más configurable. Pasarás cinco minutos para jugar con OpenCV.



cvQueryFrame(capture); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size ); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size); cvQueryFrame(capture);

debería ser suficiente!