Impostazione dei parametri della telecamera in OpenCV / Python


87

Sto usando OpenCV (2.4) e Python (2.7.3) con una fotocamera USB di Thorlabs (DC1545M).

Sto eseguendo un'analisi delle immagini su un flusso video e vorrei essere in grado di modificare alcuni dei parametri della telecamera dal mio flusso video. La cosa confusa è che sono in grado di modificare alcune delle proprietà della fotocamera ma non tutte e non sono sicuro di cosa sto facendo di sbagliato.

Ecco il codice, utilizzando i collegamenti cv2 in Python, e posso confermare che viene eseguito:

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

Per riferimento, il primo argomento nel comando cap.set () si riferisce all'enumerazione delle proprietà della telecamera, elencate di seguito:

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)

Le mie domande sono:

È possibile impostare il tempo di esposizione della fotocamera (o gli altri parametri della fotocamera) tramite python / opencv?

In caso contrario, come dovrei impostare questi parametri?

Nota: esiste un codice C ++ fornito dal produttore della fotocamera che mostra come farlo, ma non sono un esperto (di gran lunga) in C ++ e apprezzerei qualsiasi soluzione basata su Python.

Grazie in anticipo!


3
Allora qual è la quindicesima opzione, cioè CV_CAP_PROP_EXPOSURE? Non è il tempo di esposizione?
Abid Rahman K

3
È. Il punto che volevo sottolineare è che provare a modificare produce risultati misurabili. (questo è il cap.set(15, x), dove nessun valore di xproduce un cambiamento misurabile.) A proposito, grazie per il tuo blog. Mi è stato estremamente utile per essere al passo con opencv tramite python. Ottieni un voto positivo per questo :)
Mike

4
Li ha travisati. Sono tutti UNO TROPPO ALTI. Qualcuno per favore lo modifichi.
Viaggio Katastico

1
@KatasticVoyage fatto, mi sembra giusto adesso :)
linusg

2
Per opencv 4 devo rimuovere il prefisso "CV" dai nomi delle proprietà. Quindi cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Risposte:


55

Non tutti i parametri sono supportati da tutte le telecamere, in realtà sono una delle parti più problematiche della libreria OpenCV. Ogni tipo di fotocamera, dalle fotocamere Android alle fotocamere USB a quelle professionali, offre un'interfaccia diversa per modificarne i parametri. Ci sono molti rami nel codice OpenCV per supportare altrettanti di essi, ma ovviamente non tutte le possibilità sono coperte.

Quello che puoi fare è indagare sul driver della tua fotocamera, scrivere una patch per OpenCV e inviarla a code.opencv.org. In questo modo gli altri apprezzeranno il tuo lavoro, allo stesso modo in cui ti piacciono gli altri.

C'è anche la possibilità che la tua fotocamera non supporti la tua richiesta: la maggior parte delle videocamere USB sono economiche e semplici. Forse quel parametro non è disponibile per le modifiche.

Se sei sicuro che la fotocamera supporti un dato parametro (dici che il produttore della fotocamera fornisce del codice) e non vuoi fare confusione con OpenCV, puoi avvolgere quel codice di esempio in C ++ con boost :: python, per renderlo disponibile in Python. Quindi, divertiti a usarlo.


2
c'è un elenco funzionante di fotocamere supportate per opencv su mac linux windows? sembra che in futuro inizierò con il software e poi tornerò all'hardware prima dell'acquisto. scrivere un driver della fotocamera è un buon obiettivo, ma ci vorrà del tempo prima che io possa imparare a farlo.
user391339

@sammy Ho pubblicato una domanda su come farlo. Ti andrebbe di approfondire qui: stackoverflow.com/questions/27914780/...
evan54

27

Ho avuto lo stesso problema con openCV su Raspberry Pi ... non so se questo può risolvere il tuo problema, ma quello che ha funzionato per me è stato

import time
import cv2


cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

il tempo che devi utilizzare può essere diverso


wow, il tuo codice ha fatto funzionare la mia webcam logitech c615 sul mio macbook con opencv! "funziona e basta!" lo stavo provando da giorni. Non penso che sia abbastanza HD e non sono sicuro di poter cambiare i parametri di messa a fuoco, ma davvero un buon inizio.
user391339

2
Non sono affatto un esperto e 3, 4 e 15 sono numeri magici per me. È un sostituto per es. CV_CAP_PROP_FRAME_WIDTH?
Allan Nørgaard

5
cosa significa cap.set (15, -8.0)? Sto cercando di impostare il tempo di esposizione sulla mia webcam Logitech.
user391339

1
@ user391339 hai impostato il tempo di esposizione sulla webcam Logitech?
Abc

@ AllanNørgaard sì, le bandiere sono solo numeri interi sotto mentite spoglie
Kev1n91

26

Per evitare di utilizzare valori interi per identificare le VideoCaptureproprietà, è possibile utilizzare, ad esempio, cv2.cv.CV_CAP_PROP_FPSin OpenCV 2.4 e cv2.CAP_PROP_FPSin OpenCV 3.0. (Vedi anche il commento di Stefan di seguito.)

Ecco una funzione di utilità che funziona sia per OpenCV 2.4 che per 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 è impostato in precedenza nel codice delle mie utilità in questo modo:

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

2
Ho passato 10 minuti a cercare di trovare dove fossero definite quelle costanti in Python - grazie!
rescdsk

2
hai ragione - se usi una versione come 2.4.9 (2014-04-25 il download stabile da opencv.org ) devi usare la cv2.cv.CV_CAP_PROP_XXXXcosa - per maggiori informazioni su questo vedi code.opencv.org/issues/3181 se usi l'ultima filiale che puoi usarecv2.CAP_PROP_XXXX
Stefan Krüger

L'ultimo elenco delle proprietà generiche di Video Capture è qui (OpenCV 4.3)
Mikolasan

8

Non sono stato in grado di risolvere nemmeno il problema OpenCV, ma una soluzione alternativa video4linux (V4L2) funziona con OpenCV quando si utilizza Linux. Almeno, lo fa sul mio Raspberry Pi con Rasbian e la mia webcam economica. Non è solido, leggero e portatile come vorresti che fosse, ma per alcune situazioni potrebbe essere comunque molto utile.

Assicurati di aver installato l'applicazione v4l2-ctl, ad esempio dal pacchetto Debian v4l-utils. Quindi eseguire (prima di eseguire l'applicazione python o dall'interno) il comando:

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

Sovrascrive il tempo dell'otturatore della fotocamera sulle impostazioni manuali e modifica il tempo dell'otturatore (in ms?) Con l'ultimo parametro in (in questo esempio) 10. Più basso è questo valore, più scura è l'immagine.


Ha funzionato sul mio laptop basato su Intel Toshiba con Ubuntu 14.04. Ho usato v4l2-ctl per impostare qualsiasi opzione volevo, incluso il frame rate. Ho provato queste impostazioni con OpenCV ma ho ricevuto gli stessi errori di quelli sopra.
Derek Simkowiak

4

Se qualcuno si sta ancora chiedendo quale CV_CAP_PROP_EXPOSUREpotrebbe essere il valore in :

Dipende. Per la mia webcam economica devo inserire direttamente il valore desiderato, ad esempio 0,1 per 1 / 10s. Per la mia costosa telecamera industriale devo inserire -5 per ottenere un tempo di esposizione di 2 ^ -5s = 1 / 32s.


la funzione set di OpenCV può gestire un numero intero?
Saeed Masoomi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.