OpenCV同一窗口显示多张图片实现

2016/7/26
实验需求,要在OpenCV中实现同一窗口显示多张图片,非常遗憾,OpenCV中似乎没有类似Matlab中类似的函数,本文实现了一种列表式组合多张图片的函数,为了提高灵活性,函数可以设置图片显示的列数和行数,以及是否使用边框隔开。

核心思路是根据需要显示的图像,创建一个新的大图像,使用ROI(感兴趣区域)操作将需要显示的图像复制到新的大图像里。

函数代码:

Mat combineImages(vector<Mat> imgs,//@parameter1:需要显示的图像组 
                  int col,//parameter2:显示的列数
                  int row, //parameter3:显示的行数
                  bool hasMargin){//parameter4:是否设置边框
    int imgAmount = imgs.size();//获取需要显示的图像数量
    int width = imgs[0].cols;//本函数默认需要显示的图像大小相同
    int height = imgs[0].rows;//获取图像宽高
    int newWidth, newHeight;//新图像宽高
    if (!hasMargin){
        newWidth = col*imgs[0].cols;//无边框,新图像宽/高=原图像宽/高*列/行数
        newHeight = row*imgs[0].rows;
    }
    else{
        newWidth = (col + 1) * 20 + col*width;//有边框,要将上边框的尺寸,这里设置边框为20px
        newHeight = (row + 1) * 20 + row*height;
    }

    Mat newImage(newHeight, newWidth, CV_8UC3, Scalar(255, 255, 255));//显示创建设定尺寸的新的大图像;色深八位三通道;填充为白色


    int x, y,imgCount;//x列号,y行号,imgCount图片序号
    if (hasMargin){//有边框
        imgCount = 0;
        x = 0; y = 0;
        while (imgCount < imgAmount){
            Mat imageROI = newImage(Rect(x*width + (x + 1) * 20, y*height + (y + 1) * 20, width, height));//创建感兴趣区域
            imgs[imgCount].copyTo(imageROI);//将图像复制到大图中
            imgCount++;
            if (x == (col - 1)){
                x = 0;
                y++;
            }
            else{
                x++;
            }//移动行列号到下一个位置
        }
    }
    else{//无边框
        imgCount = 0;
        x = 0; y = 0;
        while (imgCount < imgAmount){
            Mat imageROI = newImage(Rect(x*width, y*height, width, height));
            imgs[imgCount].copyTo(imageROI);
            imgCount++;
            if (x == (col - 1)){
                x = 0;
                y++;
            }
            else{
                x++;
            }
        }
    }
    return newImage;//返回新的组合图像
};

使用实例

#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

Mat combineImages(vector<Mat> imgs,int col,int row,bool hasMargin);//函数声明

int main(){
    vector<Mat> imgs(4);//设置需要显示的图片组
    imgs[0] = imread("D:/research/Test1/rawimage/1.jpg");
    imgs[1] = imread("D:/research/Test1/rawimage/2.jpg");
    imgs[2] = imread("D:/research/Test1/rawimage/3.jpg");
    imgs[3] = imread("D:/research/Test1/rawimage/4.jpg");

    //调用组合图片函数,第二和第三个参数可以改变来获得不同效果,但两数相乘不能小于图片数量,否则不足以显示图片,程序会报错
    Mat m = combineImages(imgs, 2, 2, false);
    namedWindow("test",0);
    imshow("test", m);
    //imwrite("D:/research/Test1/rawimage/0.jpg", m);
    waitKey(0);
    return 0;
}

/*
Mat combineImages(vector<Mat> imgs,int col,int row,bool hasMargin){}函数省略,见上面函数代码
*/

运行结果

运行结果


版权声明:本文为github_35383443原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。