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

86

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

Estoy haciendo un análisis de imágenes en una transmisión de video y me gustaría poder cambiar algunos de los parámetros de la cámara de mi transmisión de video. Lo confuso es que puedo cambiar algunas de las propiedades de la cámara, pero no todas, y no estoy seguro de qué estoy haciendo mal.

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

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()

Como referencia, el primer argumento del comando cap.set () se refiere a la enumeración de las propiedades de la cámara, que se enumeran 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 configurar 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 es así, ¿cómo puedo configurar estos parámetros?

Nota: Hay un 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 agradecería cualquier solución basada en Python.

¡Gracias por adelantado!

Miguel
fuente
3
Entonces, ¿cuál es la decimoquinta opción, es decir, CV_CAP_PROP_EXPOSURE? ¿No es el tiempo de exposición?
Abid Rahman K
3
Está. El punto que estaba señalando es que tratar de modificar eso produce un resultado mensurable. (ese es el cap.set(15, x), donde ningún valor de xproduce un cambio mensurable). Por cierto, gracias por tu blog. Me ha resultado extremadamente útil para ponerme al día con opencv a través de python. Obtienes un voto a favor por eso :)
Mike
4
Los numeró mal. Todos son UNO DEMASIADO ALTOS. Alguien edítelo.
Katastic Voyage
1
@KatasticVoyage hecho, me parece correcto ahora :)
linusg
2
Para opencv 4 tengo que eliminar el prefijo "CV" de los nombres de las propiedades. Entonces cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Respuestas:

54

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, ofrece una interfaz diferente para modificar sus parámetros. Hay muchas ramas en el código OpenCV para admitir tantas de ellas, pero, por supuesto, no se cubren todas las posibilidades.

Lo que puede hacer es investigar el controlador de su cámara, escribir un parche para OpenCV y enviarlo a code.opencv.org. De esta forma, los demás disfrutarán de tu trabajo, de la misma forma que tú disfrutas el de los demás.

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. Quizás ese parámetro simplemente no esté disponible para modificaciones.

Si está seguro de que la cámara admite un parámetro 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 muestra en C ++ con boost :: python, para que esté disponible en Python. Entonces, disfruta usándolo.

Sam
fuente
2
¿Existe una lista de trabajo de cámaras compatibles con opencv en mac linux windows? Parece que en el futuro comenzaré con el software y luego volveré a trabajar con el hardware antes de comprarlo. escribir un controlador de cámara es un buen objetivo, pero pasará un tiempo antes de que pueda aprender a hacerlo.
user391339
@sammy He publicado una pregunta sobre cómo hacer esto. ¿Le importaría elaborar aquí: stackoverflow.com/questions/27914780/...
evan54
27

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 tienes que usar puede ser diferente

Lorenzo
fuente
¡Vaya, tu código hizo que mi cámara web logitech c615 funcionara en mi macbook con opencv! "¡Simplemente funciona!" Había estado intentando esto durante días. No creo que sea bastante HD y no estoy seguro de poder cambiar los parámetros de enfoque, pero es un buen comienzo.
user391339
2
De ninguna manera soy un experto, y el 3, 4 y 15 son números mágicos para mí. ¿Es un reemplazo para, por ejemplo, CV_CAP_PROP_FRAME_WIDTH?
Allan Nørgaard
5
¿Qué significa cap.set (15, -8.0)? Estoy intentando establecer el tiempo de exposición en mi cámara web logitech.
user391339
1
@ user391339 ¿ha configurado el tiempo de exposición en la cámara web Logitech?
Abc
@ AllanNørgaard sí, las banderas son solo números enteros disfrazados
Kev1n91
26

Para evitar el uso de valores enteros para identificar las VideoCapturepropiedades, se puede usar, por ejemplo, cv2.cv.CV_CAP_PROP_FPSen OpenCV 2.4 y cv2.CAP_PROP_FPSen OpenCV 3.0. (Vea también el comentario de Stefan a continuación).

Aquí una función de utilidad que funciona tanto para OpenCV 2.4 como para 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')
Ulrich Stern
fuente
2
Pasé 10 minutos tratando de encontrar dónde se definían esas constantes en Python, ¡gracias!
rescdsk
2
tiene razón: si usa una versión como 2.4.9 (2014-04-25, la descarga estable de opencv.org ), debe usar la cv2.cv.CV_CAP_PROP_XXXXcosa; para obtener más información sobre esto, consulte code.opencv.org/issues/3181 si usa la última rama que puede usarcv2.CAP_PROP_XXXX
Stefan Krüger
La última lista de propiedades genéricas de captura de video está aquí (OpenCV 4.3)
Mikolasan
8

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

Asegúrese de tener instalada la aplicación v4l2-ctl, por ejemplo, del paquete Debian v4l-utils. Luego ejecute (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.

JoepBC
fuente
Esto funcionó en mi portátil Toshiba Intel con Ubuntu 14.04. Usé v4l2-ctl para configurar cualquier opción que quisiera, incluida la velocidad de fotogramas. Probé estas configuraciones con OpenCV pero obtuve los mismos errores que los anteriores.
Derek Simkowiak
4

Si alguien todavía se pregunta cuál CV_CAP_PROP_EXPOSUREpodría ser el valor de :

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

Zac Diggum
fuente
la función de conjunto de OpenCV puede manejar un número entero?
Saeed Masoomi