2016-05-15 22 views
0

Ich versuche, einen Objekttracker mit OpenCV 3.1.0 und C++ nach diesem Python-Beispiel zu erstellen: http://docs.opencv.org/3.1.0/df/d9d/tutorial_py_colorspaces.html#gsc.tab=0.OpenCV - cvtColor ändert den Farbraum nicht, er ändert die Farben

Ich habe einige Probleme mit der Funktion cvtColor(), weil es die Farben meiner Bilder und nicht ihren Farbraum ändert. Ich habe diesen Code:

Mat original_image; 
original_image = imread(argv[1], CV_LOAD_IMAGE_COLOR); // The image is passed as arg 
if (!original_image.data) 
{ 
    printf("Problem!\n"); 
    return -1; 
} 

// From BGR to HSV 
Mat hsv_image(original_image.rows, original_image.cols, original_image.type()); 
cvtColor(original_image, hsv_image, CV_BGR2HSV); 
imwrite("hsv_image.png", hsv_image); 

original_image ist ein CV_8UC3, kompatibel mit cvtColor() und sollte ursprünglich in der BGR-Farbraum sein.

Ich habe das Testbild unter mit GIMP:

Test image

Und ich bekomme das Bild als Ergebnis:

HSV image - result

ich die Konvertierung von BGR in RGB beschlossen, zu versuchen, Ändern BGR2HSV zu BGR2RGB, und mit dem gleichen Testbild, bekomme ich dieses Ergebnis

Hier

, es ist mehr klar, dass die Kanäle des Bildes direkt geändert werden ...

Hat jemand eine Ahnung, was hier los ist?

+2

Im zweiten Bild verwenden, sind Sie die Kanäle von [HSV Bild] Interpretation (https://en.wikipedia.org/wiki/HSL_and_HSV) (das ist Farbton, Sättigung, Wert) als Blau, Grün und Rot. Was haben Sie als Ergebnis erwartet (imwrite erwartet BGR)? –

+0

Im Wesentlichen haben Sie diese entscheidende Information in der Dokumentation von ['imwrite()'] (http://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html#imwrite) nicht bemerkt: " Mit dieser Funktion können nur 8-Bit ... 3-Kanal-Bilder (mit BGR-Kanalreihenfolge) gespeichert werden. " –

+0

Vielen Dank Dan! Ich habe das wirklich nicht überprüft, ich dachte, dass das Problem in der Transformation lag und ich habe die Funktion imwrite() nicht überprüft. Danke nochmal! – user3368457

Antwort

1

Funktion imwrite nicht, welche Matte Farbraum schert hat und diese Information wird nicht gespeichert. Laut Dokumentation ist es BGR Bestellung.

Bevor Sie das Bild speichern, sollten Sie sicher sein, dass es sich um BGR handelt.

Wenn Sie wirklich wollen Bild als HSV speichern file storages

-1

Versuchen Sie folgendes:

// From BGR to HSV 
Mat hsv_image; 
cvtColor(original_image, hsv_image, COLOR_BGR2HSV); 
imwrite("hsv_image.png", hsv_image); 
+0

Das hat die gleiche Wirkung wie die letzten 3 Zeilen im OP-Beispiel. Es beantwortet auch nicht seine Frage, die nicht versteht, warum das Speichern eines HSV-Bildes mit 'imwrite' Unsinn zurückgibt. –