/*
@brif
显示多个 Mat 图像,显示顺序为 matArray 的输入顺序
输入的图像大小会被重塑为 200 * 200,有需要的可以自行删改
num row col 需要输入正确的对应数量,这里只是做了简单的检查。不正确输入可能会出现未知的bug
没有添加图像标题的显示,有兴趣的话可以自己做一下
@parms
matArray[] Mat图像数组
num 图像数量
row 图像行数
col 图像列数
type 图像类型
@example
显示一个两行两列的图像
imageShow(matArray, 4, 2, 2);
*/
void imageShow(Mat matArray[], int num, int row = 1, int col = 1, int type = CV_8UC1)
{
if (num > row * col)
{
cout << "num > row * col" << endl;
return;
}
int whiteVCols = 20; //图像间隔像素数量
int whiteHRows = 20;
int imgCols = 200; //显示的每张图像大小
int imgRows = 200;
Mat imgResize;
//设置图像间隔空白大小
int totalCols = imgCols * col + whiteVCols * (col + 1);
int totalRows = imgRows * row + whiteHRows * (row + 1);
//背景图像大小, 这里如果三通道的话需要改成 Scalar(255, 255, 255)
//不过我做的都是灰度图,就没处理,有需要的话可以自己改一下
Mat resultMat(totalRows, totalCols, type, Scalar(255));
int colAdd, rowAdd;
for(int i = 0;i < col;i++)
{
rowAdd = whiteHrows(j + 1) + j * imgRows;
for(int j = 0;j < row;j++)
{
colAdd = whiteVCols(i + 1) + i * imgCols;
//获取背景图像中替换为显示图像的区域
Mat mat(resultMat, Range(rowAdd, rowAdd + imgRows), Range(colAdd, colAdd + imgCols));
if((i + 1) * j < num - 1)
{//这里是为了控制显示的数量小于最大值
resize(matArray[(i - 1) * col + j - 1], imgResize, Size(imgCols, imgRows));
imgResize.copyTo(mat);
num--;
if(!num) break;
}
}
if(!num) break;
}
nameWindow("TotalMat", WINDOW_NORMAL);
imshow("TotalMat", resultMat);
}
没有用编译器,纯手打,有问题的话稍微改一下应该就没事了。也可以留言。