Unterschiedliche Bildqualität von der Picamera-Aufnahme bis zum Numpy-Array und -Pfad

8

Die Qualität der Aufnahme von der Pi-Kamera variiert, wenn sie in einem numpy-Array und direkt in einem Pfad aufgenommen wird. Ersteres ist rosafarbener als Letzteres.

Warum ist das so.?
Der Code, den ich zum Aufnehmen der Bilder verwendet habe:

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

Die Zeit, die benötigt wird, um das Bild in ein Numpy-Array aufzunehmen, ist halb so lang wie die direkte Pfaderfassung. Also, hängt es mit dem Entrauschen des Bildes zusammen?

Auf Numpy-Array aufgenommenes Bild : 0,71 Sek. Auf einem Pfad aufgenommenes Bild: 1,52 SekBild auf numpy Array aufgenommen

Bild auf einem Pfad aufgenommen

harschatech2012
quelle
Setzen Sie nach dem Schreiben die Triggerzeit für numpy. Dann kann man wirklich vergleichen. Ich bin neugierig
Jaromrax
@jaromrax Dadurch wird die Triggerzeit auf ca. 0,925 Sekunden erhöht. Aber es ist immer noch weniger als das für die Pfaderfassung.
harshatech2012
Könnte es ein Komprimierungsproblem sein? Zum Beispiel verwendet cv2 möglicherweise keine Filterung, Picamera jedoch. Wie groß sind die Ausgabedateien? Sie können mit du normal_capture.pngunddu array_capture.png
Hunter Akins

Antworten:

1

Gemäß der Picamera-Dokumentation in Teil 3.5 des Abschnitts mit den Grundrezepten:

Möglicherweise möchten Sie eine Folge von Bildern aufnehmen, die in Bezug auf Helligkeit, Farbe und Kontrast alle gleich aussehen (dies kann beispielsweise bei der Zeitrafferfotografie hilfreich sein). Es müssen verschiedene Attribute verwendet werden, um die Konsistenz über mehrere Aufnahmen hinweg sicherzustellen. Insbesondere müssen Sie sicherstellen, dass Belichtungszeit, Weißabgleich und Verstärkung der Kamera festgelegt sind:

Stellen Sie das shutter_speedAttribut auf einen angemessenen Wert ein , um die Belichtungszeit festzulegen. Optional isoauf einen festen Wert einstellen . Um dies zu beheben Belichtungsgewinne lassen analog_gainund digital_gainsetzen sich auf vernünftige Werte, dann Satz exposure_mode zu 'off'. Um den Weißabgleich zu korrigieren, setzen Sie awb_modeauf 'off'und dann awb_gainsauf ein (rotes, blaues) Tupel von Verstärkungen.

Es kann schwierig sein zu wissen, welche Werte für diese Attribute geeignet sind. Denn iso, ist eine einfache Faustregel : 100 und 200 sinnvolle Werte für den Tag sind, während 400 und 800 besser für wenig Licht sind. Um einen angemessenen Wert für shutter_speedSie zu ermitteln, können Sie das exposure_speedAttribut abfragen . Für Belichtungsgewinne reicht es normalerweise aus, zu warten, bis analog_gaingrößer als 1 ist, bevor exposure_modeeingestellt wird 'off'. Schließlich, um vernünftige Werte für die awb_gains einfache Abfrage der Eigenschaft zu bestimmen, während awb_modeauf etwas anderes als gesetzt ist 'off'. Dies zeigt Ihnen wiederum die Weißabgleichgewinne der Kamera, die durch den automatischen Weißabgleich-Algorithmus ermittelt werden.

Das folgende Skript enthält ein kurzes Beispiel für die Konfiguration dieser Einstellungen:

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
quelle