Opencv2.4学习::单窗口显示多图像

代码有些复杂,直接用就好了

#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);
}

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/82428900