代码有些复杂,直接用就好了
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void showManyImages(const vector<Mat>&srcImages,
Size imgSize)
{
int nNumImages = srcImages.size();
Size nSizeWindows;
if (nNumImages > 12){
cout << "not more than 12 images" << endl;
system("pause");
return;
}
//根据图片序列数量来确定分割窗口形态
switch (nNumImages){
case 1:nSizeWindows = Size(1, 1); break;
case 2:nSizeWindows = Size(2, 1); break;
case 3:
case 4:nSizeWindows = Size(2, 2); break;
case 5:
case 6:nSizeWindows = Size(3, 2); break;
case 7:
case 8:nSizeWindows = Size(4, 2); break;
case 9:nSizeWindows = Size(3, 3); break;
default:nSizeWindows = Size(4, 3); break;
}
//设置小图像尺寸、间隙、边界
int nShowImageSizes = 300;
int nSplitLineSize = 15;
int nAroundLineSize = 50;
//创建输出图像,图像大小根据输入源确定
const int imagesHeight = nShowImageSizes*nSizeWindows.width
+ nAroundLineSize + (nSizeWindows.width - 1)*
nSplitLineSize;
const int imagesWidth = nShowImageSizes*nSizeWindows.height
+ nAroundLineSize + (nSizeWindows.height - 1)*
nSplitLineSize;
Mat showWindowImages(imagesWidth, imagesHeight,
CV_8UC3, Scalar(0, 0, 0));
//提取对应小图像的左上角坐标x,y
int posX = (showWindowImages.cols - (nShowImageSizes*
nSizeWindows.width + (nSizeWindows.width - 1)*
nSplitLineSize)) / 2;
int posY = (showWindowImages.rows - (nShowImageSizes*
nSizeWindows.height + (nSizeWindows.height - 1)*
nSplitLineSize)) / 2;
int tempPosX = posX;
int tempPosY = posY;
//将每一幅小图像整合成大图像
for (int i = 0; i < nNumImages; i++){
//小图像坐标转换
if ((i%nSizeWindows.width == 0) && (tempPosX != posX)){
tempPosX = posX;
tempPosY += (nSplitLineSize + nShowImageSizes);
}
//利用rect区域将小图像置于大图像的相应区域
Mat tempImage = showWindowImages(Rect(tempPosX,
tempPosY, nShowImageSizes, nShowImageSizes));
//利用resize实现缩放
resize(srcImages[i], tempImage,
Size(nShowImageSizes, nShowImageSizes));
tempPosX += (nSplitLineSize + nShowImageSizes);
}
imshow("showWindowImages", showWindowImages);
}
int main()
{
vector<Mat> srcImages(2);
srcImages[0] = imread("F:\\opencv_re_learn\\3.jpg");
srcImages[1] = imread("F:\\opencv_re_learn\\2.jpg");
//判断原图像载入是否出错
for (int i = 0; i < srcImages.size(); i++){
if (!srcImages[i].data){
cout << "failed to read pic" << endl;
system("pause");
return -1;
}
}
//单窗口显示
showManyImages(srcImages, Size(1920,1080));
waitKey(0);
}