Estou usando OpenCV (2.4) e Python (2.7.3) com uma câmera USB da Thorlabs (DC1545M).
Estou fazendo uma análise de imagem em um fluxo de vídeo e gostaria de poder alterar alguns dos parâmetros da câmera do meu fluxo de vídeo. O que é confuso é que consigo alterar algumas propriedades da câmera, mas não todas, e não tenho certeza do que estou fazendo de errado.
Aqui está o código, usando as ligações cv2 em Python, e posso confirmar que ele é executado:
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 referência, o primeiro argumento no comando cap.set () refere-se à enumeração das propriedades da câmera, listadas abaixo:
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)
Minhas perguntas são:
É possível definir o tempo de exposição da câmera (ou os outros parâmetros da câmera) por meio de python / opencv?
Se não, como faria para definir esses parâmetros?
Nota: Há um código C ++ fornecido pelo fabricante da câmera mostrando como fazer isso, mas não sou um especialista (de longe) em C ++ e apreciaria qualquer solução baseada em python.
Desde já, obrigado!
fonte
cap.set(15, x)
, onde nenhum valor dex
produz uma mudança mensurável.) A propósito, obrigado pelo seu blog. Tem sido extremamente útil para mim obter acesso rápido ao opencv através do python. Você recebe um voto positivo por isso :)cv2.CV_CAP_PROP_FRAME_HEIGHT
->cv2.CAP_PROP_FRAME_HEIGHT
Respostas:
Nem todos os parâmetros são suportados por todas as câmeras - na verdade, eles são uma das partes mais problemáticas da biblioteca OpenCV. Cada tipo de câmera - de câmeras Android a câmeras USB e câmeras profissionais oferece uma interface diferente para modificar seus parâmetros. Existem muitos ramos no código OpenCV para oferecer suporte a tantos deles, mas é claro que nem todas as possibilidades são cobertas.
O que você pode fazer é investigar o driver da câmera, escrever um patch para o OpenCV e enviá-lo para code.opencv.org. Desta forma, outras pessoas irão desfrutar do seu trabalho, da mesma forma que você gosta dos outros.
Também existe a possibilidade de sua câmera não atender ao seu pedido - a maioria das câmeras USB são baratas e simples. Talvez esse parâmetro simplesmente não esteja disponível para modificações.
Se você tiver certeza de que a câmera suporta um determinado parâmetro (você diz que o fabricante da câmera fornece algum código) e não quer mexer com OpenCV, você pode embrulhar esse código de amostra em C ++ com boost :: python, para torná-lo disponível em Python. Então, aproveite o uso.
fonte
Eu tive o mesmo problema com openCV no Raspberry Pi ... não sei se isso pode resolver seu problema, mas o que funcionou para mim foi
import time import cv2 cap = cv2.VideoCapture(0) cap.set(3,1280) cap.set(4,1024) time.sleep(2) cap.set(15, -8.0)
o tempo que você tem que usar pode ser diferente
fonte
Para evitar o uso de valores inteiros para identificar as
VideoCapture
propriedades, pode-se usar, por exemplo,cv2.cv.CV_CAP_PROP_FPS
no OpenCV 2.4 ecv2.CAP_PROP_FPS
no OpenCV 3.0. (Veja também o comentário de Stefan abaixo.)Aqui está uma função de utilidade que funciona para OpenCV 2.4 e 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
é definido anteriormente em meu código de utilitários como este:from pkg_resources import parse_version OPCV3 = parse_version(cv2.__version__) >= parse_version('3')
fonte
cv2.cv.CV_CAP_PROP_XXXX
coisa - para mais informações sobre isso, consulte code.opencv.org/issues/3181 se você usa o branch mais recente que pode usarcv2.CAP_PROP_XXXX
Eu também não fui capaz de corrigir o problema do OpenCV, mas uma solução alternativa video4linux (V4L2) funciona com o OpenCV ao usar o Linux. Pelo menos no meu Raspberry Pi com Rasbian e na minha webcam barata. Não é tão sólido, leve e portátil quanto você gostaria, mas para algumas situações pode ser muito útil.
Certifique-se de ter o aplicativo v4l2-ctl instalado, por exemplo, do pacote Debian v4l-utils. Em seguida, execute (antes de executar o aplicativo Python ou de dentro) o comando:
v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10
Ele sobrescreve o tempo do obturador da câmera para configurações manuais e altera o tempo do obturador (em ms?) Com o último parâmetro para (neste exemplo) 10. Quanto mais baixo for esse valor, mais escura será a imagem.
fonte
Se alguém ainda está se perguntando qual
CV_CAP_PROP_EXPOSURE
pode ser o valor em :Depende. Para minha webcam barata, tenho que inserir o valor desejado diretamente, por exemplo, 0,1 para 1 / 10s. Para minha câmera industrial cara, tenho que inserir -5 para obter um tempo de exposição de 2 ^ -5s = 1 / 32s.
fonte