2016-03-26 7 views
0

Ich habe transparentGUI.png Bild mit transparentem Hintergrund - in GIMP es so aussieht:Kann nicht transparentes Bild in OpenCV laden und Overlay

enter image description here

Wenn ich es in OpenCV laden, indem Mat imgColorPanel = imread("transparentGUI.png", -1); und dann zeige es durch imshow("widok", imgColorPanel); an, ich kann dieses Bild mit weißem Hintergrund sehen (was falsch ist, weil es sollte transparent sein):

enter image description here

Irgendwann möchte ich dieses Bild (mit transparentem Hintergrund) auf Kamera aufgenommenen Bild überlagern. Wenn ich es mit anderen Bildern mache, die Hintergrund haben (also ist es nicht transparent) - dann ist es richtig überlagert.

Allerdings, wenn ich mit Konsole Fehlern transparentGUI.png Bild auf aufgenommene Kamerabild durch addWeighted(imgColorPanel, 0.8, imgOriginal, 0.6, 0, imgOriginal);, Programm stürzt zu überlagern will:

enter image description here

sowie Debugging-Fehler:

enter image description here

Alles funktioniert, wenn ich Bild mit transparentem Hintergrund laden und anzeigen möchte. Ich nehme an, dass es ein Konflikt mit imgOriginal sein kann, weil es in HSV ist - ich baue Programm für Objekterkennung durch HSV-Farben, also kann ich es nicht ändern. Ist es in Ordnung, das HSV-Bild mit dem BGRA-Bild zu überlagern (das Transparente)? Der Standard-Farbbereich von OpenCV ist BGR, also wird auch das Kamera-Capture-Bild in HSV konvertiert, dann kann ich es mit einem anderen Bild, das BGR ist, überlagern - also denke ich, dass etwas anderes ein Problem sein muss.

Antwort

1

imgColorPanel und imgOriginal sollten die gleiche Größe haben. Von Ihrer Aussage hat imgColorPanel 4 Kanäle (RGBA). Damit "addWeighted" funktioniert, sollte imgOriginal auch 4 Kanäle anstelle von 3 HSV-Kanälen haben.

Für "imshow", ich denke, es ist nur Anzeige Problem, und Sie können die Größe von imgColorPanel ausdrucken, um zu überprüfen, ob es 4 Kanäle hat.

+0

Wie konvertiert man imgOriginal, um dann 4 Kanäle zu haben? Ich habe versucht, 'cvtColor (imgOriginal, imgOriginal, COLOR_HSV2RGB_FULL);', aber es verursacht Absturz. Es gibt keine ** COLOR_HSV2RGBA ** Option in der 'cvtColor()' Funktion, um es von einem Farbraum in einen anderen zu konvertieren - was damit zu tun? – Chris92

1

Sie sind mit zwei unterschiedlichen Problemen:

i can see this image with white background (which is wrong, because it should be transparent)

gut, es ist nicht falsch weil Sie nicht Transparenz sehen sowieso und es gibt keinen Standard Konsens darüber, wie sollte es der Kontext unabhängig gemacht werden. Im Fall von GIMP sehen Sie etwas - den Hintergrund des Kontextfensters, das das Bild enthält. Im Fall von HighGui erhalten Sie wahrscheinlich einen weißen Hintergrund, weil das in diesem Fall der nominelle Hintergrund ist. Der einzige Weg um dies zu tun ist, dem Programm zu sagen, was genau Transparenz sehen bedeutet im Zusammenhang mit Ihrem Programm. Dies erfordert möglicherweise ein anderes GUI-System, abhängig davon, was Sie tun möchten.

program crashes with console error

Wie die Fehlermeldung sagt, ist das Problem, dass die Bilder, die Sie versuchen zu überlagern, eine andere Größe haben. Eine Lösung wäre es, zunächst ein transparentes Basisbild der gewünschten Größe, z.dies wie:

cv::Mat imgColorPanel {imgOriginal.rows, imgOriginal.cols, CV_8UC4, cv::Scalar{0,0,0,0}}; 

und dann in dem gewünschten Teil der Basis die Platte aus dem Bild laden mit (hat das Bild kleiner sein als die Basis natürlich ..) einen ROI zB:

cv::Mat panel {cv::imread("PATH/TO/FILE")}; 
cv::Rect roi {0,0,panel.rows,panel.cols}; // x,y,width,height 
cv::Mat imRoi {imgColorPanel(roi)}; 
imRoi = panel.clone(); 
+0

Ich brauche dieses Bild ** imgColorPanel ** als GUI (Menü) um transparent zu sein. Wo sollte ich Ihren Vorschlagscode verwenden - nachdem ich das Image von der Festplatte geladen habe? Ich meine, Sie haben gesagt, dass es schneller ist, als das Image von der Festplatte zu laden - aber dieses GUI-Image befindet sich auf der Festplatte. Also, was wird dieser Code tun? Sollte ich ein nicht transparentes Bild laden und dann Ihren Code verwenden, um die Transparenz für OpenCV zu fälschen? – Chris92

+1

mein Code wird einfach eine BGRA all-transparent erstellen 'cv :: Mat' - Ich habe gerade festgestellt, dass Ihr Bild nicht vollständig transparent ist, werde ich meine Antwort bearbeiten, um eine Lösung dafür hinzuzufügen. –

+0

Ich bemerkte (vielleicht offensichtlich), dass transparente Bild 4 Kanäle hat, wo Hauptbild nur 3 Kanäle hat. Ich habe es mit der Funktion '.channels()' überprüft. Es kann also auch ein Problem sein. Wenn ja, wie wird das Hauptbild (das zu überlagernde) in 4 Kanäle umgewandelt? – Chris92