web-dev-qa-db-fra.com

Définition 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 suis en train d'analyser des images sur un flux vidéo et j'aimerais pouvoir modifier certains paramètres de la caméra à partir de mon flux vidéo. Le problème est que je peux modifier certaines propriétés de l'appareil photo, mais pas toutes, et je ne suis pas sûr de ce que je fais de mal.

Voici le code, en utilisant les liaisons cv2 en 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()

Pour référence, le premier argument de la commande cap.set () fait référence à l'énumération des propriétés de la caméra, répertoriée 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)

Mes questions sont:

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

Si non, comment pourrais-je régler ces paramètres?

Remarque: Il existe un code C++ fourni par le fabricant de l'appareil photo indiquant la procédure à suivre, mais je ne suis pas un expert (de loin) en C++ et apprécierais toute solution basée sur Python.

Merci d'avance!

74
Mike

Tous les paramètres ne sont pas pris en charge par toutes les caméras. En fait, ils constituent l’une des parties les plus gênantes de la bibliothèque OpenCV. Chaque type de caméra (de Android aux caméras professionnelles en passant par les caméras professionnelles) offre une interface différente pour modifier ses paramètres. OpenCV comprend de nombreuses branches qui en supportent autant, mais bien sûr, toutes les possibilités ne sont pas couvertes.

Ce que vous pouvez faire est d’examiner le pilote de votre appareil photo, d’écrire un correctif pour OpenCV et de l’envoyer à code.opencv.org. De cette façon, les autres apprécieront votre travail, de la même manière que vous apprécierez ceux des autres.

Il se peut également que votre appareil photo ne prenne pas votre demande en charge - la plupart des caméras USB sont économiques et simples. Peut-être que ce paramètre n'est simplement pas disponible pour des modifications.

Si vous êtes certain que la caméra prend en charge un paramètre donné (vous indiquez que le fabricant de la caméra fournit du code) et que vous ne voulez pas manipuler OpenCV, vous pouvez envelopper cet exemple de code en C++ avec boost :: python pour le rendre disponible en Python. Ensuite, profitez-en.

46
Sam

Pour éviter d'utiliser des valeurs entières pour identifier les propriétés VideoCapture, vous pouvez 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 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 utilitaire comme ceci:

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

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 a été

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

24
Lorenzo

Je ne pouvais pas résoudre le problème OpenCV non plus, mais une solution de contournement de video4linux (V4L2) fonctionne avec OpenCV avec Linux. Au moins, cela se produit 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 dans certaines situations, cela peut néanmoins être très utile.

Assurez-vous que l’application v4l2-ctl est installée, par exemple. du paquet Debian v4l-utils. Puis exécutez (avant d'exécuter l'application python, ou de 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 l'heure de l'obturateur de votre appareil photo sur les réglages manuels et change la durée de l'obturateur (en ms?) Avec le dernier paramètre en (dans cet exemple) 10. Plus cette valeur est basse, plus l'image est sombre.

7
JoepBC

Si quelqu'un se demande encore quelle est la valeur de CV_CAP_PROP_EXPOSURE:

Dépend. Pour ma webcam bon marché, je dois entrer directement la valeur souhaitée, par exemple. 0,1 pour 1/10s. Pour mon appareil photo industriel coûteux, je dois entrer -5 pour obtenir un temps de pose de 2 ^ -5s = 1/32s.

3
Zac Diggum