OpenCV学习-单窗口显示多幅图像

在图像处理算法效果测试中,我们常常需要对比显示输入与输出图像,常遇到的问题就是在单窗口下显示多幅图像,在OpenCV中我们可以综合利用坐标变换与Rect区域提取来实现单窗口显示多幅图像。首先根据输入图像个数与尺寸确定输入源图像小窗口的构成形态;然后设定每个图像小窗口具体构成。

 

 

单窗口显示多幅图像代码如下:

#include<opencv2\core\affine.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 imageSize){
	int nNumImages = srcImages.size();
	Size nSizeWindows;
	if (nNumImages > 12){
		cout << "no more tha 12 images" << endl;
		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);
	}
	//设置小图像尺寸,间隙,边界
	int nShowImageSize = 200;
	int nSplitLineSize = 15;
	int nAroundLineSize = 50;
	//创建输出图像,图像大小根据输入源来确定
	const int imagesHeight = nShowImageSize*
		nSizeWindows.width + nAroundLineSize +
		(nSizeWindows.width - 1)*nSplitLineSize;
	const int imagesWidth = nShowImageSize*
		nSizeWindows.height + nAroundLineSize +
		(nSizeWindows.height - 1)*nSplitLineSize;
	cout << imagesWidth << "  " << imagesHeight << endl;
	Mat showWindowsImages(imagesWidth, imagesHeight, CV_8UC3, Scalar(0, 0, 0));
	//提取对应小图像的左上角坐标x,y
	int posX = (showWindowsImages.cols - (nShowImageSize*nSizeWindows.width +
		(nSizeWindows.width - 1)*nSplitLineSize)) / 2;
	int posY = (showWindowsImages.rows - (nShowImageSize*nSizeWindows.height +
		(nSizeWindows.height - 1)*nSplitLineSize)) / 2;
	cout << posX << "  " << posY << endl;
	int tempPosX = posX;
	int tempPosY = posY;
	//将每一幅小图像整合成一幅大图像
	for (int i = 0; i < nNumImages; i++){
		//小图像坐标转换
		if ((i%nSizeWindows.width == 0) && (tempPosX != posX)){
			tempPosX = posX;;
			tempPosY += (nSplitLineSize + nShowImageSize);
		}
		//利用Rect区域将小图像置于大图像的相应区域
		Mat tempImage = showWindowsImages
			(Rect(tempPosX, tempPosY, nShowImageSize, nShowImageSize));
		//利用resize函数实现图像缩放
		resize(srcImages[i], tempImage,
			Size(nShowImageSize, nShowImageSize));
		tempPosX += (nSplitLineSize + nShowImageSize);
	}
	imshow("showWindowImages", showWindowsImages);
}

int main(){
	//图像源输入
	vector<Mat>srcImage(9);
	srcImage[0] = imread("C:\\Users\\DELL\\Desktop\\1.jpg");
	srcImage[1] = imread("C:\\Users\\DELL\\Desktop\\1.jpg");
	srcImage[2] = imread("C:\\Users\\DELL\\Desktop\\1.jpg");
	srcImage[3] = imread("C:\\Users\\DELL\\Desktop\\2.jpg");
	srcImage[4] = imread("C:\\Users\\DELL\\Desktop\\2.jpg");
	srcImage[5] = imread("C:\\Users\\DELL\\Desktop\\2.jpg");
	srcImage[6] = imread("C:\\Users\\DELL\\Desktop\\3.jpg");
	srcImage[7] = imread("C:\\Users\\DELL\\Desktop\\3.jpg");
	srcImage[8] = imread("C:\\Users\\DELL\\Desktop\\3.jpg");
	//判断当前vector读入的正确性
	for (int i = 0; i < srcImage.size(); i++){
		if (srcImage[i].empty()){
			cout << "read error" << endl;
			/*return -1;*/
		}
	}
	//调用 单窗口显示图像
	showManyImages(srcImage, Size(512, 400));
	waitKey(0);
	system("pause");
	return 0;
}

结果:

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV-Python提供了一系列用于图像处理和计算机视觉任务的功能,其中包括图像匹配。图像匹配是指在一幅图像中寻找与目标图像相似的区域。通过OpenCV-Python,你可以使用模板匹配技术来实现图像匹配。 模板匹配是一种基于像素值相似度的匹配方法,它通过在输入图像中滑动一个模板图像,并计算模板与滑动窗口区域的相似度来找到最佳匹配位置。在OpenCV-Python中,你可以使用cv2.matchTemplate()函数来实现模板匹配。 下面是一个简图像匹配的例子代码: ```python import cv2 import numpy as np # 读取输入图像和目标图像 input_img = cv2.imread('input_img.jpg') target_img = cv2.imread('target_img.jpg') # 将输入图像和目标图像转换为灰度图像 input_gray = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY) target_gray = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY) # 执行模板匹配 result = cv2.matchTemplate(input_gray, target_gray, cv2.TM_CCOEFF_NORMED) # 获取最佳匹配位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) top_left = max_loc # 获取目标图像的宽度和高度 target_width, target_height = target_gray.shape[::-1] # 绘制矩形框标记目标图像 cv2.rectangle(input_img, top_left, (top_left + target_width, top_left + target_height), (0, 255, 0), 2) # 显示结果图像 cv2.imshow('Result', input_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先读取了输入图像和目标图像,并将它们转换为灰度图像。然后,我们使用cv2.matchTemplate()函数执行模板匹配,并通过获取最佳匹配位置来找到目标图像在输入图像中的位置。最后,我们使用cv2.rectangle()函数在输入图像上绘制一个矩形框来标记目标图像的位置,并显示结果图像。 请注意,这只是一个简图像匹配示例,你可以根据自己的需求进行更复杂的图像匹配操作,例如使用不同的匹配方法、应用阈值、使用多个目标图像等。同时,确保你已经安装了OpenCV-Python库,并准备好了输入图像和目标图像以供匹配使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值