2.7单窗口中显示多幅图像

news2024/9/22 13:44:39

目录

1.实验原理

2.实验代码

3.运行结果


1.实验原理

在Opencv中,我们可以综合利用坐标变换与Rect区域提取来实现单窗口显示多幅图像。首先根据输入图像个数与尺寸确定输入源图像小窗口的构成形态,然后设定每个图像小窗口的具体构成,包括边界、间隙等,最后根据小窗口确定输出图像的尺寸,利用缩放图像函数resize进行图像缩放,完成单窗口下多幅图像的显示。

Resizes an image.
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );
参数说明:

src:输入图像,通常为cv::Mat类型。
dst:输出图像,与输入图像具有相同的类型。
size:目标图像的尺寸,表示为(width, height)。
fx:沿水平轴的缩放因子,默认为0,表示不进行水平缩放。如果 fx 大于 1,则图像会被放大;如果小于 1,则图像会被缩小。
fy:沿垂直轴的缩放因子,默认为0,表示不进行垂直缩放。
interpolation:插值方法,有以下几种可选:默认方法是 INTER_LINEAR,即双线性插值。
   cv::INTER_NEAREST:最近邻插值,速度最快,但质量最差。
   cv::INTER_LINEAR:线性插值,速度较快,质量较好。
   cv::INTER_AREA:区域插值,适用于图像缩小,速度较慢,质量最好。
   cv::INTER_CUBIC:三次样条插值,速度适中,质量较好。
   cv::INTER_LANCZOS4:Lanczos插值,速度适中,质量较好。

2.实验代码

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <opencv2/highgui/highgui_c.h>
#include <opencv2\opencv.hpp>
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 
using namespace cv;
#include<iostream>
using namespace std;

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; //图片宽度 高度都为200
	int nSplitLineSize = 15; //图片之间间隙
	int nAroundLineSize = 50; //图片与窗口之间间隙
	//创建输出图像,图像大小根据输入源来确定
	const int imagesWidth = nShowImageSize*nSizeWindows.width + nAroundLineSize +(nSizeWindows.width - 1)*nSplitLineSize; //新窗口宽度
	const int imagesHeight = 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;//左上角第一张图片的x坐标 左右方向
	int posY = (showWindowsImages.rows - (nShowImageSize*nSizeWindows.height +(nSizeWindows.height - 1)*nSplitLineSize)) / 2;//左上角第一张图片的y坐标 上下方向
	cout << posX << "  " << posY << endl;
	int tempPosX = posX;
	int tempPosY = posY;
	//将每一幅小图像整合成一幅大图像
	for (int i = 0; i < nNumImages; i++)
    {
		//小图像坐标转换
		if ((i%nSizeWindows.width == 0) && (tempPosX != posX))
        {
//图像根据 nSizeWindows = Size(3, 2) 布局大小,对新的一行数据点 左上角左边进行更新
			tempPosX = posX;
			tempPosY += (nSplitLineSize + nShowImageSize);
		}
		//利用Rect区域将小图像置于大图像的相应区域
		Mat tempImage = showWindowsImages(Rect(tempPosX, tempPosY, nShowImageSize, nShowImageSize));
		resize(srcImages[i], tempImage,Size(nShowImageSize, nShowImageSize));//利用resize函数实现图像缩放
		tempPosX += (nSplitLineSize + nShowImageSize);
	}//for
	imshow("单窗口显示多图片", showWindowsImages);
}
 
int main()
{
	//图像源输入
	vector<Mat>srcImage(9);
	srcImage[0] = imread("010.jpg");
	srcImage[1] = imread("010.jpg");
	srcImage[2] = imread("010.jpg");
	srcImage[3] = imread("020.jpg");
	srcImage[4] = imread("020.jpg");
	srcImage[5] = imread("020.jpg");
	srcImage[6] = imread("030.jpg");//安乐
	srcImage[7] = imread("030.jpg");
	srcImage[8] = imread("030.jpg");
	//判断当前vector读入的正确性
	for (int i = 0; i < srcImage.size(); i++)
    {
		if (srcImage[i].empty())
        {
			cout << "read error" << endl;
			return -1;
		}
	}
	//调用 单窗口显示图像
	showManyImages(srcImage, Size(147, 118));
	waitKey(0);
	system("pause");
	return 0;
}

3.运行结果

注意根据vector<Mat>srcImage(9);输入大小不同,将会不同布局

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超级外链工具,可发9600条优质外链

超级外链工具&#xff0c;是一款在线全自动化发外链的推广工具。使用本工具可免费为网站在线批量增加外链&#xff0c;大大提高外链发布工作效率&#xff0c;是广大草根站长们必备的站长工具。 外链工具只是网站推广的辅助工具&#xff0c;一般适用于短时间内无法建设大量外链…

stm32入门学习16-闪存

&#xff08;一&#xff09;闪存 在之前的学习中&#xff0c;已经学习过了W25Q64这个外挂闪存&#xff0c;在stm32内部也有一块闪存&#xff0c;其主要用于存放我们编译的代码&#xff0c;如果我们需要一些掉电不丢失的数据&#xff0c;但是又懒得外挂一块闪存&#xff0c;就可…

树莓派4b换源+安装neo4j知识图谱

烧录树莓派系统&#xff0c; ssh 1.在SD中的boot区中&#xff0c;新建两个文件ssh(没有任何后缀)和wpa_supplicant.conf。 2.往wpa_supplicant.conf中写入 countryCN ctrl_interfaceDIR/var/run/wpa_supplicant GROUPnetdev update_config1 network{ ssid“wifi账号” psk“…

VS Code 配置docker 管理员权限终端

问题描述 在容器中需要使用sudo或者su root时候&#xff0c;权限不够&#xff0c;被灵魂提问。 然而&#xff0c;镜像是官方发布的&#xff0c;翻遍了githubissues也没有找到password. 解决 Attach shell 在docker插件中&#xff0c;attach shell 可以直接获得shell。 所…

AI顾投高级策略之六:马丁格尔策略

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a; 在投资世界中&#xff0c;隐藏着众多精妙的策略&#xff0c;其中一些历经时间的考验&#xff0c;被基金经理们广泛使用。今天&#xff0c;我们要探讨的是马丁格尔策略…

不依靠for循环,Python如何对列表进行去重并保留排列顺序

在python中&#xff0c;我们想要从列表中删除重复元素&#xff0c;并且保留去重之前的先后排列顺序。在这里&#xff0c;我们本文不谈论for循环&#xff0c;我们来谈论其他的更优方法——OrderedDict和set。 要知道&#xff0c;OrderedDict可以通过保留插入顺序来实现元素去重…

【面试题】接雨水

接雨水 仅学习 一、问题描述 二、解调思路 这个问题是一个典型的双指针问题&#xff0c;也称为"接雨水问题"。我们可以通过遍历数组两次来解决这个问题&#xff1a;一次从左到右&#xff0c;一次从右到左&#xff0c;分别记录每个位置左边和右边的最大高度。然后&…

springboot学校防疫物资管理平台的设计与实现boot--论文源码调试讲解

第2章 开发环境与技术 本章节对开发学校防疫物资管理平台管理系统需要搭建的开发环境&#xff0c;还有学校防疫物资管理平台管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&…

C语言—扫雷项目

一、扫雷游戏分析和设计 &#xff08;1.1&#xff09;扫雷游戏功能说明 • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷 • 可以排查雷 ◦ 如果位置不是雷&#xff0c;就显⽰周围有⼏个雷 ◦ 如…

C# 元组类型详解与示例

文章目录 1. 元组的基本概念1.1 元组的定义1.2、元组的类型 2. 元组的特性2.1 元组的命名元素2.2 元组的类型推断2.3 元组的结构2.4 元组的比较和哈希 3. 元组的实际应用3.1 方法返回多个值3.2 作为数据容器3.3 元组与数据结构 4. 总结 元组&#xff08;Tuple&#xff09;是 C#…

【AI】机器学习基本概念详解1

友情链接&#xff1a;numpy使用、SciPy、Matplotlib 定期更新&#xff0c;建议关注、点赞、收藏。 目录 监督学习 or 非监督学习clustering & non-clustering分类 or 回归线性回归逻辑回归 目标函数or 损失函数规范化归一化标准化正则化&#xff08;惩罚penalty&#xff09…

如何制作优秀的年终总结PPT?

制作优秀的年终总结PPT&#xff0c;是每位职场人士在年底时的一项重要任务。 一个优秀的年终总结PPT不仅能够清晰地展示你过去一年的工作成果&#xff0c;还能让领导对你的工作能力和态度留下深刻印象。 下面&#xff0c;我将从几个方面详细讲解如何制作这样的PPT&#xff0c…

杰理AC7916与MK米客方德SD NAND:高效适配,卓越存储

杰理科技的AC7916是一款高性能、多功能的系统级芯片&#xff08;SoC&#xff09;&#xff0c;广泛应用于智能终端产品&#xff0c;如AI智能音箱、蓝牙音箱、蓝牙耳机等。这款芯片以其卓越的性能和丰富的接口选项&#xff0c;满足了多样化的市场需求。 AC7916接口及性能特点 AC…

如何避免常见的R语言学习陷阱?

学习R语言不仅能够增强数据分析能力&#xff0c;还能开拓解决复杂问题的新方法。然而&#xff0c;在学习R语言的过程中&#xff0c;许多初学者会遇到各种陷阱&#xff0c;这些陷阱不仅会延缓学习进度&#xff0c;还可能导致学习动机的丧失。 陷阱一&#xff1a;忽视基础知识 基…

Java面向对象与封装

目录 封装 封装引入 private修饰符 this关键字 构造函数 JavaBean 标准JavaBean JavaBean中的成员与数据库的关系 static关键字 static基本使用 static关键字访问特点 可变参数 对象数组与传值/址调用 对象数组 传值调用与传址调用 命令行参数 封装 封装引入 …

Unity 中创建动画的教程

Unity 动画创建教程 在游戏开发中&#xff0c;生动的动画能够极大地提升玩家的体验。在这篇教程中&#xff0c;我们将一起探索如何在 Unity 中创建动画。 一、准备工作 首先&#xff0c;确保您已经安装了最新版本的 Unity 引擎。创建一个新的 Unity 项目或者打开您现有的项目…

昂科烧录器支持PAI-IC澎湃微电子的32位微控制器PT32L031K6T6

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中PAI-IC澎湃微电子的32位微控制器PT32L031K6T6已经被昂科的通用烧录平台AP8000所支持。 PT32L031K6T6是基于Cortex-M0内核的一款32位高性能微控制器&#xff0c;支持工作电压 1…

C# VisionPro 海康相机SDK源代码

运行界面如下所时&#xff1a; 实时图像效果如下&#xff1a; Winform窗体代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo…

为什么选择搭建自己的大模型?

在数字化和智能化的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成为企业和机构的核心驱动力。无论是在数据分析、自然语言处理&#xff0c;还是自动化决策&#xff0c;AI的应用范围广泛且深远。而在众多AI解决方案中&#xff0c;本地搭建专属的大模型正逐渐成…

前端vue项目——打包部署(nginx中部署静态资源)

1、当前的开发方式 前端人员开发前端&#xff0c;后端人员开发后端的java工程&#xff0c;最终要将开发完毕的前端工程和后端工程分开部署在对应的服务器上&#xff08;前端流行的nginx&#xff09; 2、打包 &#xff08;1&#xff09;原理 &#xff08;2&#xff09; &#xf…