Definir parâmetros de câmera em OpenCV / Python

86

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!

Mike
fonte
3
Então, qual é a 15ª opção, isto é, CV_CAP_PROP_EXPOSURE? Não é o tempo de exposição?
Abid Rahman K
3
Isto é. O que eu queria dizer é que tentar modificar isso produz qualquer resultado mensurável. (isto é cap.set(15, x), onde nenhum valor de xproduz 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 :)
Mike
4
Ele os numerou mal. Eles são todos UM DEMASIADO ALTO. Alguém, por favor, edite.
Katastic Voyage
1
@KatasticVoyage pronto, parece certo para mim agora :)
linusg
2
Para opencv 4, tenho que remover o prefixo "CV" dos nomes das propriedades. Então cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Respostas:

54

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.

Sam
fonte
2
existe uma lista de trabalho de câmeras suportadas para opencv no Mac Linux Windows? Parece que no futuro começarei com o software e depois voltarei ao hardware antes da compra. escrever um driver de câmera é uma boa meta, mas vai demorar um pouco até que eu possa aprender a fazer isso.
user391339
@sammy Eu postei uma pergunta sobre como fazer isso. Você poderia
entrar
27

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

Lorenzo
fonte
uau, seu código fez minha webcam logitech c615 funcionar no meu macbook com opencv! "simplesmente funciona!" eu estava tentando isso há dias. não acho que seja muito HD e não tenho certeza se posso alterar os parâmetros de foco, mas um bom começo.
user391339
2
Não sou um especialista, e 3, 4 e 15 são números mágicos para mim. É um substituto para, por exemplo, CV_CAP_PROP_FRAME_WIDTH?
Allan Nørgaard
5
o que cap.set (15, -8,0) significa? Estou tentando definir o tempo de exposição na minha webcam da Logitech.
user391339
1
@ user391339 você definiu o tempo de exposição na webcam Logitech?
Abc
@ AllanNørgaard sim, as bandeiras são apenas números inteiros disfarçados
Kev1n91
26

Para evitar o uso de valores inteiros para identificar as VideoCapturepropriedades, pode-se usar, por exemplo, cv2.cv.CV_CAP_PROP_FPSno OpenCV 2.4 e cv2.CAP_PROP_FPSno 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')
Ulrich Stern
fonte
2
Passei 10 minutos tentando descobrir onde essas constantes foram definidas no Python - obrigado!
rescdsk de
2
você está certo - se você usar uma versão como 2.4.9 (2014-04-25 o download estável de opencv.org ) você tem que usar a cv2.cv.CV_CAP_PROP_XXXXcoisa - 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
Stefan Krüger
A lista mais recente de propriedades genéricas do Video Capture está aqui (OpenCV 4.3)
Mikolasan
8

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.

JoepBC
fonte
Isso funcionou no meu laptop baseado em Intel Toshiba executando Ubuntu 14.04. Usei v4l2-ctl para definir qualquer opção que quisesse, incluindo a taxa de quadros. Eu tentei essas configurações com OpenCV, mas obtive os mesmos erros acima.
Derek Simkowiak de
4

Se alguém ainda está se perguntando qual CV_CAP_PROP_EXPOSUREpode 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.

Zac Diggum
fonte
a função definida do OpenCV pode lidar com números inteiros?
Saeed Masoomi