Qualidade de imagem diferente, da captura de picamera à matriz e caminho numpy

8

A qualidade da captura da câmera Pi varia quando capturada em uma matriz numpy e quando capturada diretamente em um caminho. O primeiro tem um tom mais rosado do que o posterior.

Por que é que.?
O código que usei para capturar as imagens:

from picamera import PiCamera
import cv2
import time

camera = PiCamera()
camera.resolution = (1280, 720)
img = np.empty((720, 1280, 3), dtype=np.uint8)

start = time.time()
camera.capture(img, "bgr")
print("Trigger time: " + str(time.time() - start))
cv2.imwrite("array_capture.png", img)

start = time.time()
camera.capture("normal_capture.png")
print("Trigger time: " + str(time.time() - start))

O tempo necessário para capturar a imagem em um array numpy é metade do tempo da captura de caminho direto. Então, isso está relacionado ao cancelamento de ruído da imagem?

Imagem capturada em um array numpy: 0,71 seg. Imagem capturada em um caminho: 1,52 seg.Imagem capturada em matriz numpy

Imagem capturada em um caminho

harshatech2012
fonte
Coloque o tempo de disparo para numpy após a gravação. Então você pode realmente comparar. Estou curioso
jaromrax 16/17
@jaromrax Isso aumenta o tempo de disparo para cerca de 0,925 seg. Mas ainda é menos do que isso para a captura do caminho.
harshatech2012
Poderia ser um problema de compactação? Por exemplo, talvez o cv2 não use filtragem, mas o picamera. Quais são os tamanhos dos arquivos de saída? Você pode verificar com du normal_capture.pngedu array_capture.png
Hunter Akins

Respostas:

1

De acordo com a documentação do Picamera na parte 3.5 da seção de receitas básicas:

Convém capturar uma sequência de imagens com a mesma aparência em termos de brilho, cor e contraste (isso pode ser útil na fotografia em timelapse, por exemplo). Vários atributos precisam ser usados ​​para garantir consistência em várias fotos. Especificamente, você precisa garantir que o tempo de exposição, o balanço de brancos e os ganhos da câmera sejam todos fixos:

Para fixar o tempo de exposição, defina o shutter_speedatributo com um valor razoável. Opcionalmente, defina isoum valor fixo. Para corrigir os ganhos de exposição, deixe analog_gaine digital_gainaceite valores razoáveis ​​e defina o modo de exposição para 'off'. Para corrigir o balanço de brancos, defina como awb_modee 'off', em seguida, defina awb_gainsuma tupla (vermelha, azul) de ganhos.

Pode ser difícil saber quais valores apropriados podem ser para esses atributos. Pois iso, uma regra simples é que 100 e 200 são valores razoáveis ​​para o dia, enquanto 400 e 800 são melhores para pouca luz. Para determinar um valor razoável, shutter_speedvocê pode consultar o exposure_speedatributo Para ganhos de exposição, geralmente é suficiente esperar até que analog_gainseja maior que 1 antes de exposure_modeser definido como 'off'. Por fim, para determinar valores razoáveis ​​para awb_gains simplesmente consultar a propriedade enquanto awb_modeestiver definido como algo diferente de 'off'. Mais uma vez, isso mostrará os ganhos de balanço de branco da câmera, conforme determinado pelo algoritmo de balanço de branco automático.

O script a seguir fornece um breve exemplo de configuração dessas configurações:

from time import sleep
from picamera import PiCamera

camera = PiCamera(resolution=(1280, 720), framerate=30)
# Set ISO to the desired value
camera.iso = 100
# Wait for the automatic gain control to settle
sleep(2)
# Now fix the values
camera.shutter_speed = camera.exposure_speed
camera.exposure_mode = 'off'
g = camera.awb_gains
camera.awb_mode = 'off'
camera.awb_gains = g
# Finally, take several photos with the fixed settings
camera.capture_sequence(['image%02d.jpg' % i for i in range(10)])
Matt
fonte