98 votes

Réglage des paramètres de la caméra dans OpenCV/Python

J'utilise OpenCV (2.4) et Python (2.7.3) avec une caméra USB de Thorlabs (DC1545M).

Je fais de l'analyse d'image sur un flux vidéo et j'aimerais pouvoir modifier certains des paramètres de la caméra à partir de mon flux vidéo. Ce qui est déroutant, c'est que je peux modifier certaines propriétés de la caméra, mais pas toutes, et je ne suis pas sûr de ce que je fais mal.

Voici le code, en utilisant les liaisons cv2 dans Python, et je peux confirmer qu'il fonctionne :

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

À titre de référence, le premier argument de la méthode cap.set() fait référence à l'énumération des propriétés de la caméra, énumérées ci-dessous :

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)

(Veuillez noter, comme le commentateur Markus Weber l'a fait remarquer ci-dessous, que dans OpenCV 4 vous devez enlever le préfixe "CV" du nom de la propriété, ex. cv2.CV_CAP_PROP_FRAME_HEIGHT -> cv2.CAP_PROP_FRAME_HEIGHT )

Mes questions sont les suivantes :

Est-il possible de régler le temps d'exposition de la caméra (ou les autres paramètres de la caméra) via python/opencv ?

Sinon, comment dois-je procéder pour définir ces paramètres ?

Note : Il existe un code C++ fourni par le fabricant de la caméra montrant comment faire cela, mais je ne suis pas un expert (et de loin) en C++ et j'apprécierais toute solution basée sur Python.

Merci d'avance !

61voto

sammy Points 10591

Tous les paramètres ne sont pas supportés par toutes les caméras - en fait, ils constituent l'une des parties les plus problématiques de la bibliothèque OpenCV. Chaque type de caméra - des caméras Android aux caméras USB en passant par les caméras professionnelles - offre une interface différente pour modifier ses paramètres. Il y a beaucoup de branches dans le code OpenCV pour supporter le plus grand nombre d'entre elles, mais bien sûr toutes les possibilités ne sont pas couvertes.

Ce que vous pouvez faire est d'examiner le pilote de votre caméra, d'écrire un patch pour OpenCV et de l'envoyer à code.opencv.org. De cette façon, les autres apprécieront votre travail, tout comme vous apprécierez celui des autres.

Il est également possible que votre caméra ne prenne pas en charge votre demande - la plupart des caméras USB sont bon marché et simples. Peut-être que ce paramètre n'est tout simplement pas disponible pour les modifications.

Si vous êtes sûr que la caméra supporte un paramètre donné (vous dites que le fabricant de la caméra fournit du code) et que vous ne voulez pas vous embêter avec OpenCV, vous pouvez envelopper cet exemple de code en C++ avec boost::python, pour le rendre disponible en Python. Ensuite, vous pourrez l'utiliser avec plaisir.

29voto

Lorenzo Points 299

J'ai eu le même problème avec openCV sur Raspberry Pi... je ne sais pas si cela peut résoudre votre problème, mais ce qui a fonctionné pour moi est le suivant

import time
import cv2

cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

le temps que vous devez utiliser peut être différent

26voto

Ulrich Stern Points 4613

Pour éviter d'utiliser des valeurs entières pour identifier les VideoCapture on peut utiliser, par exemple, cv2.cv.CV_CAP_PROP_FPS dans OpenCV 2.4 et cv2.CAP_PROP_FPS dans OpenCV 3.0. (Voir aussi le commentaire de Stefan ci-dessous).

Voici une fonction utilitaire qui fonctionne à la fois pour OpenCV 2.4 et 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 est défini plus tôt dans mon code d'utilitaires comme ceci :

from pkg_resources import parse_version
OPCV3 = parse_version(cv2.__version__) >= parse_version('3')

8voto

JoepBC Points 101

Je n'ai pas pu résoudre le problème OpenCV non plus, mais une solution de contournement de video4linux (V4L2) fonctionne. avec OpenCV sous Linux. En tout cas, c'est le cas sur mon Raspberry Pi avec Rasbian et ma webcam bon marché. Ce n'est pas aussi solide, léger et portable que vous le souhaiteriez, mais pour certaines situations, cela peut néanmoins être très utile.

Assurez-vous que l'application v4l2-ctl est installée, par exemple à partir du paquet Debian v4l-utils. Ensuite, exécutez (avant d'exécuter l'application python, ou depuis l'intérieur) la commande :

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

Il écrase le temps d'obturation de votre appareil photo sur les réglages manuels et modifie le temps d'obturation (en ms ?) avec le dernier paramètre à (dans cet exemple) 10. Plus cette valeur est faible, plus l'image est sombre.

5voto

Zac Diggum Points 93

Si quelqu'un se demande encore quelle est la valeur en CV_CAP_PROP_EXPOSURE pourrait être :

Ça dépend. Pour ma webcam bon marché, je dois entrer directement la valeur souhaitée, par exemple 0,1 pour 1/10s. Pour ma caméra industrielle coûteuse, je dois entrer -5 pour obtenir un temps d'exposition de 2^-5s = 1/32s.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X