OpenCV在同一窗口中相邻显示2个图像

cod*_*fun 12 opencv roi image-processing

我试图使用OpenCV在同一窗口中水平相邻地显示2个图像.

我已经尝试过使用adjustROI函数.图像1的宽度为1088像素,高度为2208像素,而图像2的宽度为1280像素,高度为2208像素.请在下面的代码中提出可能出现的问题.我得到的是一张图片大小Image2也包含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);
Run Code Online (Sandbox Code Playgroud)

mpe*_*kov 28

编辑:这是我做你想做的事情:

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);
Run Code Online (Sandbox Code Playgroud)

复制构造函数创建Mat标题的副本,该副本指向由每个Rects 定义的ROI .

完整代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

编译:

g++ foo.cpp -o foo.out `pkg-config --cflags --libs opencv`
Run Code Online (Sandbox Code Playgroud)

EDIT2:

以下是它的外观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;
}
Run Code Online (Sandbox Code Playgroud)

您必须跟踪当前的ROI是什么,并且移动ROI的语法可能有点不直观.结果与第一个代码块相同.


Sum*_*Dey 9

由于图像的高度(Mat的行)相同,hconcat因此可以使用函数来水平连接两个图像(Mat),因此可以用于在同一窗口中并排显示它们.OpenCV doc.
它适用于灰度和彩色图像.

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

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

imshow("Display side by side", newImage);
waitKey(0);
Run Code Online (Sandbox Code Playgroud)

为了完整起见,vconcat可以用于垂直连接.


Fáb*_*rez 5

这是一个灵感来自@ 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;
}
Run Code Online (Sandbox Code Playgroud)

此解决方案使用Mat :: operator()(const Rect&roi),而不是使用复制构造函数.虽然两种解决方案都是O(1),但这种解决方案似乎更清晰.