2012-10-30 26 views
11

Ich versuche mit OpenCV 2 Bilder horizontal nebeneinander im selben Fenster darzustellen.OpenCV zeigt zwei nebeneinander liegende Bilder im selben Fenster an

Ich habe versucht mit adjustROI-Funktion für diese.Bild 1 hat 1088 Pixel Breite und 2208 Pixel Höhe während Bild 2 hat 1280 Pixel Breite und 2208 Pixel Höhe.Bitte schlagen Sie vor, was im Code unten falsch sein könnte.Alles, was ich bekomme ist ein Bild der Größe Image2 mit Inhalt von Image2.

Mat img_matches=Mat(2208,2368,imgorig.type());//set size as combination of img1 and img2 
img_matches.adjustROI(0,0,0,-1280); 
imgorig.copyTo(img_matches); 
img_matches.adjustROI(0,0,1088,1280); 
imgorig2.copyTo(img_matches); 

Antwort

27

EDIT: Hier ist, wie würde ich das tun, was Sie tun möchten:

Mat left(img_matches, Rect(0, 0, 1088, 2208)); // Copy constructor 
imgorig.copyTo(left); 
Mat right(img_matches, Rect(1088, 0, 1280, 2208)); // Copy constructor 
imgorig2.copyTo(right); 

Die Kopierkonstruktoren erstellen eine Kopie des Mat Header, der von jedem der definierten ROI-Punkte Rect s.

Voll Code:

#include <cv.h> 
#include <highgui.h> 

using namespace cv; 

int 
main(int argc, char **argv) 
{ 
    Mat im1 = imread(argv[1]); 
    Mat im2 = imread(argv[2]); 
    Size sz1 = im1.size(); 
    Size sz2 = im2.size(); 
    Mat im3(sz1.height, sz1.width+sz2.width, CV_8UC3); 
    Mat left(im3, Rect(0, 0, sz1.width, sz1.height)); 
    im1.copyTo(left); 
    Mat right(im3, Rect(sz1.width, 0, sz2.width, sz2.height)); 
    im2.copyTo(right); 
    imshow("im3", im3); 
    waitKey(0); 
    return 0; 
} 

Kompiliert mit:

g++ foo.cpp -o foo.out `pkg-config --cflags --libs opencv` 

EDIT2:

Hier ist, wie es aussieht mit adjustROI:

#include <cv.h> 
#include <highgui.h> 

using namespace cv; 

int 
main(int argc, char **argv) 
{ 
    Mat im1 = imread(argv[1]); 
    Mat im2 = imread(argv[2]); 
    Size sz1 = im1.size(); 
    Size sz2 = im2.size(); 
    Mat im3(sz1.height, sz1.width+sz2.width, CV_8UC3); 
    // Move right boundary to the left. 
    im3.adjustROI(0, 0, 0, -sz2.width); 
    im1.copyTo(im3); 
    // Move the left boundary to the right, right boundary to the right. 
    im3.adjustROI(0, 0, -sz1.width, sz2.width); 
    im2.copyTo(im3); 
    // restore original ROI. 
    im3.adjustROI(0, 0, sz1.width, 0); 
    imshow("im3", im3); 
    waitKey(0); 
    return 0; 
} 

Sie müssen den aktuellen ROI im Auge behalten, und die Syntax zum Verschieben des ROI kann etwas unintelligent sein. Das Ergebnis entspricht dem ersten Codeblock.

+1

Dies funktioniert auch nicht.Ich denke, die ersten beiden Parameter müssen in beiden Fällen Null sein, da die Höhe beider Bilder (fast) gleich ist und ich sie nur nebeneinander platzieren muss. – code4fun

+0

Ich habe gerade festgestellt, adjustROI verhält sich etwas anders als das, was ich gewohnt bin (das alte C cvSetImageROI). Schau dir meine aktualisierte Antwort an. – misha

+0

Ich hatte etwas ähnliches versucht. Der Kopierkonstruktor gibt eine Kopie der ursprünglichen Matrix, also wenn ich versuche, "img_matches" zu drucken, ist es noch leer. Während das Drucken "links" und "rechts" separat diese Bilder gibt – code4fun

5

Hier ist eine Lösung in @ mishas Antwort inspiriert.

#include <cv.h> 
#include <highgui.h> 

using namespace cv; 

int 
main(int argc, char **argv) 
{ 
    Mat im1 = imread(argv[1]); 
    Mat im2 = imread(argv[2]); 
    Size sz1 = im1.size(); 
    Size sz2 = im2.size(); 
    Mat im3(sz1.height, sz1.width+sz2.width, CV_8UC3); 
    im1.copyTo(im3(Rect(0, 0, sz1.width, sz1.height))); 
    im2.copyTo(im3(Rect(sz1.width, 0, sz2.width, sz2.height))); 
    imshow("im3", im3); 
    waitKey(0); 
    return 0; 
} 

Statt den Kopierkonstruktor der Verwendung dieser Lösung verwendet Mat::operator()(const Rect& roi). Während beide Lösungen O (1) sind, scheint diese Lösung sauberer zu sein.

7

Da die Höhe (Reihen von Mat) der Bilder gleich sind, kann die Funktion dazu verwendet werden, zwei Bilder (Mat) horizontal zu verketten und damit nebeneinander im selben Fenster darzustellen. OpenCV doc.
Es funktioniert mit Graustufen- und Farbbildern.

Mat im1, im2; 
// source images im1 and im2 

Mat newImage; 
hconcat(im1, im2, newImage); 

imshow("Display side by side", newImage); 
waitKey(0); 

Aus Gründen der Vollständigkeit, vconcat kann für die vertikale Verkettung verwendet.

Verwandte Themen