2012-06-13 19 views
5

ich ein paar Bilder in Mat Objekte haben alle mit gleichen Abmessungen Ich möchte eine bix cv::Mat-Objekt erstellen, sie alleConcatenate Mat in OpenCV

So ist die Dimension der neuen Matrix zu halten ist: widthNew = widthOld x Anzahl der Matrizen, Höhe bleibt unverändert.

Ich fand, dass eine solche Kopie verwendet getan werden könnte:

void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL) 

aber dann, wie die Maske drei verschiedenen Zeiten für die drei Matrizen definiert werden könnten ?.

Grüße, Moataz

+0

Achten Sie darauf, dass die maximale Größe für ein IplImage irgendwo bei 4000 * 4000 liegt. Möglicherweise müssen Sie auch die Auflösung des eingegebenen Bildes reduzieren. – jlengrand

+0

Die Maske ist optional, Sie müssen keine definieren. –

+0

in Ordnung. Ich werde das bedenken, thnx –

Antwort

1

Sie wahrscheinlich nehmen an the source code of cvShowManyImages() aussehen wollen, die eine Funktion ist, die mehrere Bilder als Eingabe und verkettet sie zu einem einzigen 3-Kanal-Bild angezeigt werden:

Das verwendete Verfahren ist zu Setzen Sie die ROIs eines einzelnen großen Bildes und ändern Sie dann die Größe und kopieren Sie die Eingabebilder in das einzelne große Bild.

Wenn Sie ein Zielbild erstellen, das groß genug ist, um Ihre anderen Bilder aufzunehmen, brauchen Sie die Größe nicht zu ändern.

Wenn Sie wissen möchten, wie zwischen IplImage < ->cv::Mat konvertieren, überprüfen Sie this thread.

+0

klingt interessant, thnx. Ich denke, ich werde die Idee kopieren, um etwas ähnliches zu implementieren, mit reinem cv :: Mat anstelle von IpImage –

2

Ich denke, es gibt eine einfache Möglichkeit, dies zu tun. OpenCV hat eine nicht dokumentierte Methoden namens hconcat() und vconcat(). Die erste ist für die horizontale Verkettung und die zweite für die vertikale Verkettung.

Sie können sie auf diese Weise verwenden:

Mat A, B; 
... //In this part you initialize the Mat A and Mat B. 

Mat H, V; //These are the destination matrices 
hconcat(A, B, H); 
vconcat(A, B, V); 

Ich hoffe, dass dies helfen kann.

+0

Das Ziel kann das gleiche wie eine der Quellen so sein 'vconcat (out, out1, out); vconcat (out, out2, out); 'funktionierte gut für mich in einem Multithread-Kontext (zum Kombinieren der Ausgabe von einzelnen Threads). – Izaan