2014-03-04 13 views
5

Ich habe ein Bild, das 4 Kanäle hat und im 4 * UINT8 Format ist.Warum funktioniert die convertto-Funktion von openCV nicht?

Ich versuche, es zu 3-Kanal-Schwimmer zu konvertieren, und ich bin mit diesem Code:

images.convertTo(images,CV_32FC3,1/255.0); 

Nach der Konvertierung ist das Bild in einem Float-Format, aber immer noch 4 Kanäle. Wie kann ich den vierten (Alpha) Kanal in OpenCV loswerden?

Antwort

8

Wie @AldurDisciple sagte Mat::convertTo() vorgesehen ist zum Ändern der Datentyp eines Mat verwendet werden, nicht für die Änderung der Anzahl der Kanäle.

zu trainieren, sollten Sie es in zwei Schritte aufgeteilt:

cvtColor(image, image, CV_BGRA2BGR);  // 1. change the number of channels 
image.convertTo(image, CV_32FC3, 1/255.0); // 2. change type to float and scale 
+0

Hallo Herr, Was bedeutet '1/255.0'? Es ist nützlich für welche Sache? –

+5

@Kabyle '1/255.0' ist hier der Skalierungsfaktor, der die Werte' [0, 255] 'in' [0, 1] 'umwandelt. Einzelheiten finden Sie im Dokument ['Mat :: convertTo()'] (http://docs.opencv.org/modules/core/doc/basic_structures.html?highlight=convertto#mat-convertto). – herohuyongtao

1

Die Funktion convertTo dient ausschließlich dazu, den Datentyp eines zu ändern. Wie in der Dokumentation (link) erwähnt, ist die Anzahl der Kanäle des Ausgabebildes immer die gleiche wie das Eingabebild.

Wenn Sie den Datentyp und die Anzahl der Kanäle reduzieren ändern möchten, sollten Sie eine Kombination aus split verwenden, merge und convertTo:

cv::Mat img_8UC4; 

cv::Mat chans[4]; 
cv::split(img_8UC4,chans); 

cv::Mat img_8UC3; 
cv::merge(chans,3,img_8UC3); 

cv::Mat img_32FC3; 
img_8UC3.convertTo(img_32FC3); 

Ein anderer Ansatz sein kann, den Algorithmus selbst neu codieren, Das ist ziemlich einfach und wahrscheinlich effizienter.

0

OpenCV cvtColor function können Sie den Typ und die Anzahl der Kanäle einer Mat konvertieren.

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0) 

So etwas wie dieses einen farbigen 4-Kanal zu einem farbigen 3-Kanal umwandeln würde:

cvtColor(image, image, CV_BGRA2BGR, 3);

Oder es ist wahrscheinlich effizienter, die mixChannels function zu verwenden, wenn Sie die Dokumentation in seinem Beispiel zeigt, wie ein Kanal aufgeteilt wird.

Dann, wenn Sie wirklich wollen, es auf eine bestimmte Art zu ändern:

image.convertTo(image,CV_32F); 
Verwandte Themen