Speichern eines Bildes mit imwrite in opencv schreibt alles schwarz, aber imshow wird korrekt angezeigt

8

Ursprüngliche Frage

Dieser Beispielcode zeigt das korrekt erstellte Bild an, speichert jedoch ein PNG mit nur schwarzen Pixeln. Die Mat ist im CV_32FC3-Format, also 3 Float-Kanäle.

Die beantworteten Fragen, die ich gefunden habe, befassen sich mit Bildmanipulationsproblemen oder falschem Konvertieren oder Speichern in JPEG mit verschiedenen Komprimierungen.

%Vor%

Welche Änderungen müssen vorgenommen werden, damit es wie erwartet gespeichert wird?

Berriels Lösung

%Vor%     
USERID_UNK 04.05.2016, 11:32
quelle

1 Antwort

13

Wie Sie in der Dokumentation lesen können:

  

Die Funktion imwrite speichert das Bild in der angegebenen Datei. Das Bild   Das Format wird basierend auf der Dateinamenserweiterung ausgewählt (siehe imread () für die   Liste der Erweiterungen). Nur 8-Bit (oder 16-Bit unsigniert (CV_16U) für den Fall   von PNG, JPEG 2000 und TIFF) einkanalig oder 3-kanalig (mit 'BGR'   Kanalreihenfolge) Bilder können mit dieser Funktion gespeichert werden. Wenn das Format,   Tiefe oder Kanalreihenfolge ist unterschiedlich, verwenden Sie Mat :: convertTo () und   cvtColor (), um es vor dem Speichern zu konvertieren.

Sie sollten convertTo verwenden, um von CV_32FC3 in CV_8UC3 zu konvertieren, um das gleiche Ergebnis zu erhalten:

%Vor%

Übrigens wird imshow() korrekt angezeigt, weil ...

  
  • Wenn das Bild 8-Bit vorzeichenlos ist, wird es so angezeigt.
  •   
  • Wenn das Bild eine vorzeichenlose 16-Bit-Ganzzahl oder eine 32-Bit-Ganzzahl ist, werden die Pixel durch 256 geteilt. Das heißt, der Wertebereich [0,255 * 256] wird zugeordnet   [0,255].
  •   
  • Wenn das Bild ein 32-Bit-Gleitkommawert ist, werden die Pixelwerte mit 255 multipliziert. Dies bedeutet, dass der Wertebereich [0,1] zugeordnet wird   [0,255].
  •   

Grundsätzlich ist der gleiche Trick, was Sie vor dem Schreiben tun müssen.

    
Berriel 04.05.2016, 12:06
quelle

Tags und Links