image-processingopencvroi

OpenCV displaying 2 images adjacently in the same window


I am trying to display 2 images horizontally adjacent to each other in the same window using OpenCV.

I have tried using adjustROI function for this.Image 1 has 1088 pixels width and 2208 pixels height while Image 2 has 1280 pixels width and 2208 pixels height.Please suggest what could be wrong in the code below.All I am getting is an image of size Image2 with content from Image2 as well.

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

Solution

  • EDIT: Here's how I'd do what you want to do:

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

    The copy constructors create a copy of the Mat header that points to the ROI defined by each of the Rects.

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

    Compiles with:

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

    EDIT2:

    Here's how it looks with 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;
    }
    

    You have to keep track of what the current ROI is, and the syntax for moving the ROI around can be a little un-intuitive. The result is the same as the first block of code.