Configuración de los parámetros de la Cámara en OpenCV / Python


Estoy usando OpenCV (2.4) y Python (2.7.3) con una cámara USB de Thorlabs (DC1545M).

Estoy haciendo un análisis de imagen en un flujo de video y me gustaría poder cambiar algunos de los parámetros de la cámara de mi flujo de video. Lo confuso es que soy capaz de cambiar algunas de las propiedades de la cámara, pero no todas, y no estoy seguro de lo que estoy haciendo mal.

Aquí está el código, usando los enlaces cv2 en Python, y puedo confirmar que pistas:

import cv2


#capture from camera at location 0
cap = cv2.VideoCapture(0)
#set the width and height, and UNSUCCESSFULLY set the exposure time
cap.set(3,1280)
cap.set(4,1024)
cap.set(15, 0.1)

while True:
    ret, img = cap.read()
    cv2.imshow("input", img)
    #cv2.imshow("thresholded", imgray*thresh2)

    key = cv2.waitKey(10)
    if key == 27:
        break


cv2.destroyAllWindows() 
cv2.VideoCapture(0).release()

Para referencia, el primer argumento en el cap .el comando set() se refiere a la enumeración de las propiedades de la cámara, enumeradas a continuación:

0. CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
1. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
2. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file
3. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
4. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
5. CV_CAP_PROP_FPS Frame rate.
6. CV_CAP_PROP_FOURCC 4-character code of codec.
7. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
8. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
9. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
10. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
11. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
12. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
13. CV_CAP_PROP_HUE Hue of the image (only for cameras).
14. CV_CAP_PROP_GAIN Gain of the image (only for cameras).
15. CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
16. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
17. CV_CAP_PROP_WHITE_BALANCE Currently unsupported
18. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)

Mis preguntas son:

¿Es posible establecer el tiempo de exposición de la cámara (u otros parámetros de la cámara) a través de python/opencv?

Si no, ¿cómo voy a establecer estos parámetros?

Nota: Hay código C++ proporcionado por el fabricante de la cámara que muestra cómo hacer esto, pero No soy un experto (ni mucho menos) en C++ y apreciaría cualquier solución basada en python.

Gracias de antemano!

Author: linusg, 2012-07-10

5 answers

No todos los parámetros son compatibles con todas las cámaras - en realidad, son una de las partes más problemáticas de la biblioteca OpenCV. Cada tipo de cámara-desde cámaras android hasta cámaras USB y profesionales ofrecen una interfaz diferente para establecer sus parámetros. Y hay muchas ramas en código OpenCV para soportar tantas de ellas, pero por supuesto no todas las posibilidades están cubiertas.

Lo que puede hacer es investigar el controlador de la cámara, hacer un parche para OpenCV y enviarlo a code.opencv.org. De esta manera otros disfrutarán de su trabajo, de la misma manera que usted disfruta de otros.

También existe la posibilidad de que su cámara no admita su solicitud: la mayoría de las cámaras USB son baratas y simples. Tal vez ese parámetro no está disponible para modificaciones.

Si está seguro de que la cámara admite un param determinado (dice que el fabricante de la cámara proporciona algún código) y no quiere meterse con OpenCV, puede envolver ese código de ejemplo en C++ con boost:: python, para hacerlo disponible en Python. Luego, disfruta usándolo.

 32
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-08 13:29:36

Para evitar el uso de valores enteros para identificar las propiedades VideoCapture, se puede usar, por ejemplo, cv2.cv.CV_CAP_PROP_FPS en OpenCV 2.4 y cv2.CAP_PROP_FPS en OpenCV 3.0. (Véase también el comentario de Stefan a continuación.)

Aquí una función de utilidad que funciona tanto para OpenCV 2.4 y 3.0:

# returns OpenCV VideoCapture property id given, e.g., "FPS"
def capPropId(prop):
  return getattr(cv2 if OPCV3 else cv2.cv,
    ("" if OPCV3 else "CV_") + "CAP_PROP_" + prop)

OPCV3 se establece anteriormente en mi código de utilidades como este:

from pkg_resources import parse_version
OPCV3 = parse_version(cv2.__version__) >= parse_version('3')
 20
Author: Ulrich Stern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-04 22:39:03

Tuve el mismo problema con OpenCV en Raspberry Pi... no sé si esto puede resolver su problema, pero lo que funcionó para mí fue

import time
import cv2


cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

El tiempo que tiene que usar puede ser diferente

 17
Author: Lorenzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-24 21:16:02

Tampoco pude solucionar el problema de OpenCV, pero una solución para video4linux (V4L2) funciona con OpenCV cuando se usa Linux. Al menos, lo hace en mi Raspberry Pi con Rasbian y mi webcam barata. Esto no es tan sólido, ligero y portátil como te gustaría que fuera, pero para algunas situaciones podría ser muy útil sin embargo.

Asegúrese de tener instalada la aplicación v4l2-ctl, por ejemplo, del paquete Debian v4l-utils. Ejecutar (antes de ejecutar la aplicación python, o desde dentro) el comando:

v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10

Sobrescribe el tiempo de obturación de la cámara a la configuración manual y cambia el tiempo de obturación (en ms?) con el último parámetro a (en este ejemplo) 10. Cuanto menor sea este valor, más oscura será la imagen.

 6
Author: JoepBC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 19:18:52

Si alguien todavía se pregunta cuál podría ser el valor en CV_CAP_PROP_EXPOSURE:

Depende. Para mi cámara web barata tengo que introducir el valor deseado directamente, por ejemplo, 0.1 para 1/10s. Para mi cámara industrial cara tengo que introducir -5 para obtener un tiempo de exposición de 2^-5s = 1/32s.

 1
Author: Zac Diggum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-29 23:12:23