2012-10-30 18 views
11

Sto provando a visualizzare 2 immagini in orizzontale adiacenti l'una all'altra nella stessa finestra usando OpenCV.OpenCV che visualizza 2 immagini adiacenti nella stessa finestra

Ho provato ad utilizzare la funzione adjustROI per questo.Immagine 1 ha una larghezza di 1088 pixel e un'altezza di 2208 pixel mentre l'immagine 2 ha una larghezza di 1280 pixel e un'altezza di 2208 pixel.Si prega di suggerire cosa potrebbe essere sbagliato nel codice qui sotto.Tutto sto ricevendo è un'immagine di dimensioni Image2 con contenuto anche di 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); 

risposta

27

EDIT: Ecco come farei quello che si vuole fare:

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); 

I costruttori di copia creare una copia del Mat intestazione che punta al ROI definita da ciascuno dei Rect s.

codice completo:

#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; 
} 

Compila con:

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

EDIT2:

Ecco come appare con 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; 
} 

Devi tenere traccia di quale sia il ROI corrente e la sintassi per spostare il ROI può essere un po 'poco intuitiva. Il risultato è lo stesso del primo blocco di codice.

+1

Anche questo non funziona. Penso che i primi 2 parametri debbano essere pari a zero in entrambi i casi, perché l'altezza di entrambe le immagini è (quasi) uguale e ho solo bisogno di metterle una accanto all'altra. – code4fun

+0

Mi sono appena reso conto che adjustROI si comporta in modo leggermente diverso rispetto a quello a cui sono abituato (il vecchio C cvSetImageROI). Controlla la mia risposta aggiornata. – misha

+0

avevo provato qualcosa di simile.Il costruttore di copie sta dando una copia della matrice originale, quindi quando provo a stampare "img_matches" è ancora vuoto.Mentre la stampa "sinistra" e "destra" dà separatamente quelle immagini – code4fun

5

Ecco una soluzione ispirata alla risposta di @ misha.

#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; 
} 

Invece di usare il costruttore di copia, questa soluzione utilizza Mat::operator()(const Rect& roi). Mentre entrambe le soluzioni sono O (1), questa soluzione sembra più pulita.

7

Poiché l'altezza (righe di Mat) delle immagini sono le stesse, la funzione hconcat può essere utilizzata per concatenare orizzontalmente due immagini (Mat) e quindi può essere utilizzata per visualizzarle fianco a fianco nella stessa finestra. OpenCV doc.
Funziona con immagini a colori e in scala di grigi.

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

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

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

Per ragioni di completezza, vconcat può usato per la concatenazione verticale.

Problemi correlati