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版权协议,转载请附上原文出处链接和本声明。