opencv_c++学习(十)

news2024/11/25 2:30:07

一、图像尺寸变化

图像插值原理

在这里插入图片描述
在图像变换的过程中往往需要对像素进行相关的操作。如上图(左)所示,我们会遇到两个相邻的像素块需要映射到同样的位置中,或者两个相邻的位置的像素中间需要映射出一个位置的像素块。这时候我们就需要一些差值的方法。如上图(右)所示,是一个双线性插值操作。

图像缩放、翻转、拼接

缩放:

reslize(lnputArray src, OutputArray dst,Size dsize, double fx=e,
double fy = e, int interpolation = INTER_LINEAR

src:输入图像。
dst:输出图像,图像的数据类型与src相同。
dsize:输出图像的尺寸。
fx:水平轴的比例因子,如果将水平轴变为原来的两倍,则赋值为2,与dsize作用类似。
fy:垂直轴的比例因子,如果将垂直轴变为原来的两倍,则赋值为2,与dsize作用类似。
interpolation:差值方法的标志。
翻转:

cvflip(lnputArray src,OutputArray dst, int flipCode)

src:输入图像。
dst:输出图像,与src具有相同的大小和数据类型以及通道数。
flipCode:翻转方式标志,数值大于0表示绕y轴进行翻转;数值等于0,表示绕x轴进行翻转﹔数值小于0表示绕两个轴旋转。
拼接:
横向拼接

hconcat(InputArray src1, lnputArray src2, outputArray dst)

纵向拼接

vconcat(InputArray src1, lnputArray src2, outputArray dst)

srcl:第一个需要拼接的Mat类矩阵。
src2:第二个需要拼接的Mat类矩阵,与第一个参数具有相同的宽度、数据类型和通道数
dst:拼接后的Mat类矩阵。
代码实例如下:

	Mat src = imread("图片1.png");

	//缩小图像以及插值操作
	Mat smallLmg, bigLmg0, bigLmg1, bigLmg2;

	//缩小图像
	resize(src, smallLmg, Size(15, 15), 0, 0, INTER_AREA);

	//最近邻差值操作
	resize(smallLmg, bigLmg0, Size(30, 30), 0, 0, INTER_NEAREST);

	//双线性插值
	resize(smallLmg, bigLmg1, Size(30, 30), 0, 0, INTER_LINEAR);
	
	//双三次插值
	resize(smallLmg, bigLmg2, Size(30, 30), 0, 0, INTER_CUBIC);

	Mat img_x, img_y, img_xy;

	//沿x轴翻转
	flip(src, img_x, 0);

	//沿y轴翻转
	flip(src, img_y, 1);

	//先沿x轴翻转,再沿y轴翻转
	flip(src, img_xy, -1);

二、图像的仿射变换

在这里插入图片描述

warpAffine(InputArray src, outputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR,borderMode =,  int BORDER__CONSTANT, const Scalar & borderValue = scalar())

src:输入图像。
dst:仿射变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。M:2×3的变换矩阵(如上图的仿射变换矩阵)。
dsize:输出图像的尺寸。
flags:插值方法标志。
borderMode:像素边界外推方法的标志。
borderValue:填充边界使用的数值,默认情况下为0。
在这里插入图片描述
图像旋转:

getRotationMatrix2D (Point2f center, double angle, double scale

center:图像旋转的中心位置。
angle:图像旋转的角度,单位为度,正值为逆时针旋转。
scale:两个轴的比例因子,可以实现旋转过程中的图像缩放,不缩放输入1。在这里插入图片描述
计算仿射变换矩阵:

Mat cv::getAffineTransform ( const Point2f src[], const Point2f dst[]

src[]:原图像中的三个像素坐标。
dst[]:目标图像中的三个像素坐标。
示例如下:

	//读取图片
	Mat src = imread("图片1.png");
	if (!src.data)
	{
		printf("不能打开空图片");
		return -1;
	}

	//定义仿射变换的矩阵、仿射变换后的图像
	Mat rotation, img_warp;

	//设置图像旋转的角度
	double angle = 30;

	//设置输出图像的尺寸
	Size dst_size(src.rows, src.cols);

	//设置图像的旋转中心
	Point2f center(src.rows / 2.0, src.cols / 2.0);

	//计算仿射变换的矩阵
	rotation = getRotationMatrix2D(center, angle, 1);

	//进行仿射变换
	warpAffine(src, img_warp, rotation, dst_size);
	imshow("img_warp", img_warp);

	//三点法仿射变换
	Point2f src_points[3];
	Point2f dst_points[3];

	//原始图像中的三个点
	src_points[0] = Point2f(0, 0);
	src_points[1] = Point2f(0, (float)(src.cols - 1));
	src_points[2] = Point2f((float)(src.rows - 1), (float)(src.cols - 1));

	//仿射变换后图像中的三个点
	dst_points[0] = Point2f((float)(src.rows)*0.11, (float)(src.cols)*0.20);
	dst_points[1] = Point2f((float)(src.rows)*0.15, (float)(src.cols)*0.70);
	dst_points[2] = Point2f((float)(src.rows)*0.81, (float)(src.cols)*0.85);

	Mat rotation1, img_warp1;

	//根据对应点求取仿射变换矩阵
	rotation1 = getAffineTransform(src_points, dst_points);

	//进行仿射变换
	warpAffine(src, img_warp1, rotation1, dst_size);

	imshow("img_warp1", img_warp1);

三、图像透视变换

在这里插入图片描述
透视矩阵求解:

getPerspectiveTransform(const Point2f src[], const Point2f dst[], int soliveMethod = DECOMP_LU

src[]:原图像中的四个像素坐标。
dst[]:目标图像中的四个像素坐标。
solveMethod:计算透视变换矩阵方法的选择标志
在这里插入图片描述
透视变换函数:

warpPerspective(lnputArray src, outputArray dst, InputArray M, size dsize, int flags = INTER_LINEAR, borderMode, int BORDER_CONSTANT, const Scalar & borderValue = Scalar(

src:输入图像。
dst:透视变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。
M:3×3的变换矩阵。
dsize:输出图像的尺寸。
flags:插值方法标志。
borderMode:像素边界外推方法的标志。
borderValue:填充边界使用的数值,默认情况下为0。

	//读取图片
	Mat src = imread("图片1.png");
	if (!src.data)
	{
		printf("不能打开空图片");
		return -1;
	}

	Point2f src_points[4];
	Point2f dst_points[4];

	//找到四个角点的坐标
	src_points[0] = Point2f(5.0, 10.0);
	src_points[1] = Point2f(10.0, 8.0);
	src_points[2] = Point2f(1.0, 10.0);
	src_points[3] = Point2f(15.0, 15.0);

	//透视变换后的四个角点的坐标
	dst_points[0] = Point2f(0.0, 0.0);
	dst_points[1] = Point2f(10.0, 0.0);
	dst_points[2] = Point2f(0.0, 10.0);
	dst_points[3] = Point2f(10.0, 10.0);

	//设置变换矩阵,变换后的图像的Mat对象
	Mat rotation, img_wrap;

	//获取透视变换的矩阵
	rotation = getPerspectiveTransform(src_points, dst_points);

	//进行透视变换投影
	warpPerspective(src, img_wrap, rotation, src.size());

	//显示变换后的图像
	imshow("src", src);
	imshow("img_wrap", img_wrap);

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

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

相关文章

JavaEE(系列7) -- 多线程(wait 和 notify 的使用)

首先对上一章节的指令重排序,在进行解释一下; 假设现在有连个线程 t1 和 t2 t1频繁(速度特别快)读取主内存,效率比较低,就被优化成直接读自己的工作内存。 t2修改了主内存的结果,由于t1没有读主内存,导致修改不能被识别到。 1.什么…

全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我

文章目录 一、设计模式七大原则1、单一职责原则2、接口隔离原则3、依赖倒置原则4、里氏替换原则5、开闭原则6、迪米特法则7、合成复用原则 二、UML类图三、设计模式1、创建型模式(1)单例模式(常用)(2)原型模…

mybatis-config.xml文件中的mappers标签

前言 在MyBatis中&#xff0c;< mapper >标签非常重要&#xff0c;因为它对应着我们存放sql语句的xml文件&#xff0c;在之前的使用中我们都是使用resource来指定路径&#xff0c;但其实除了resource可以指定路径的还有url和class但路径形式有所不同&#xff0c;下面来讨…

用「明道云+ChatGPT+Weaviate」挑战零代码1小时实现ChatPDF

ChatGPT流行起来之后&#xff0c;快速的出现了一批基于ChatGPT的工具应用&#xff0c;ChatPDF就是其中比较受欢迎的一款。它是一个可以让你与PDF文件进行对话的工具&#xff0c;既可以帮助你快速提取PDF文件中的信息&#xff0c;例如手册、论文、合同、书籍等&#xff1b;也可以…

【计算机视觉】最后显示的CIFAR-100数据集照片很模糊怎么解决?

文章目录 一、前言二、如何解决2.1 使用图像增强技术2.2 使用插值方法2.3 使用更高分辨率的图像数据集2.4 手动调整图像尺寸 三、总结 一、前言 如果从CIFAR-100数据集加载的图像显示模糊&#xff0c;可能有几个可能的原因&#xff1a; 分辨率较低&#xff1a;CIFAR-100数据集…

全力押注预制菜,叮咚买菜或错失即时零售红利

实际上&#xff0c;叮咚买菜相比于美团、京东更适合抢分即时零售的市场红利。 目前美团进入即时零售的逻辑是&#xff0c;拥有几百万骑手的履约软硬件可以复用&#xff0c;同时从外卖场景延伸到其他消费场景比较丝滑&#xff0c;从平台几千万用户的温饱满足&#xff0c;延展到多…

计算机网络实验(ensp)-实验10:三层交换机实现VLAN间路由

目录 实验报告&#xff1a; 实验操作 1.建立网络拓扑图并开启设备 2.配置主机 1.打开PC机 配置IP地址和子网掩码 2.配置完成后点击“应用”退出 3.重复步骤1和2配置每台PC 3.配置交换机VLAN 1.点开交换机 2.输入命名&#xff1a;sys 从用户视图切换到系统视图…

网络工程师精选习题详解(一)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1.在IPv4地址192.168.2.0/24中&#xff0c;表示主机的二进制位数是&#xff08; &#xff09;位。 A.8 B.16 C.24 D.32 答案&#xff1a;A /24示网络…

面对职业焦虑,我们能做些什么?

目录 大环境分析&#xff1a;AI 发展汹涌而上温水煮青蛙&#xff1a;那些“被替代”的“我们”码农分类&#xff1a;程序员都在做些什么码农黑暗季&#xff1a;失业潮原因分析程序员短期真的可替代吗&#xff1f;AI 发展来势汹汹&#xff0c;如何顺势而为最后&#xff1a;纵观全…

SpringBoot整合Swagger2,让接口文档管理变得更简单

在软件开发的过程中&#xff0c;接口文档的编写往往是一个非常重要的环节&#xff0c;因为它是前端和后端沟通的桥梁&#xff0c;帮助团队更好地协作。然而&#xff0c;手动编写接口文档不仅耗费时间&#xff0c;还容易出错&#xff0c;因此我们需要一种简单的方法来管理接口文…

宝武中南钢铁借助飞桨让钢筋超限监控有了“火眼金睛”

现代钢铁工业生产过程是一个复杂而庞大的生产体系&#xff0c;涵盖数百道工序。 在70多年的发展历程中&#xff0c;炼钢、轧钢、连铸以及节能减排等各项技术不断进化&#xff0c;无一不印证了中国钢铁在技术创新之路上获得的持续性突破。如今&#xff0c;宝武中南钢铁&#xff…

Java websocket 使用

简介 WebSocket 是一种基于 TCP 协议的全双工通信协议&#xff0c;可以在浏览器和服务器之间建立实时、双向的数据通信。在 Java 中&#xff0c;我们可以使用 Java API for WebSocket&#xff08;JSR 356&#xff09;来实现 WebSocket。 WebSocket 的作用是在 Web 应用程序中…

基于html+css的图展示77

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Charles安装及抓取APP接口

一、Charles使用 Charles是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0c;能够在Windows&#xff0c;Mac&#xff0c;…

STM32F4_DAC数模转换

目录 1. DAC简介 2. DAC框图 3. DAC功能介绍 3.1 DAC通道使能 3.2 DAC输出缓冲器使能 3.3 DAC数据格式 3.4 DAC转换 3.5 DAC输出电压 3.6 DAC触发选择 3.7 DMA请求 3.8 生成噪声 3.9 生成三角波 4. 相关寄存器 4.1 DAC控制寄存器&#xff1a;DAC_CR 4.2 DAC1通道…

1-《java基础》

1-《java基础》 一.java基本数据类型和引用类型1.基本数据类型&#xff1a;2.引用数据类型3.基本数据类型和引用数据类型区别3.1 存储位置3.2 传递方式 4.自动装箱&#xff0c;自动拆箱 二.equals和的区别三.static1.static关键字的用途2.static方法3.static变量4.static代码块…

Unity中级客户端开发工程师的进阶之路

上期UWA技能成长系统之《Unity高级客户端开发工程师的进阶之路》得到了很多Unity开发者的肯定。通过系统的学习&#xff0c;可以掌握游戏性能瓶颈定位的方法和常见的CPU、GPU、内存相关的性能优化方法。 UWA技能成长系统是UWA根据学员的职业发展目标&#xff0c;提供技能学习的…

加密解密软件VMProtect教程(六):主窗口之控制面板“项目”部分(3)

VMProtect 是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

wpf字符串格式化来实现空格占位 对齐问题Arial字符宽度不一致ChitGPT真牛

console是正常的。xml界面不正常&#xff0c;对不齐。 可能的原因各字符宽度不一致导致的。换个字体试试。黑体就正常。默认的Arial就不对。 在 C# 中&#xff0c;可以使用字符串格式化来实现空格占位。具体的做法是在格式字符串中使用占位符 {n}&#xff0c;其中 n 表示要占用…

一单一结,靠Python爬虫赚外快,在家就能做

今年以来我们听到了太多负面声音&#xff0c;“互联网寒冬”“裁员”“优化”“失业”&#xff0c;同时也听到了许多朋友迷茫的声音&#xff1a; 面对未来的焦虑&#xff1a;未来我应该往哪方面发展&#xff1f; 面对裁员的迷茫&#xff1a;被裁&#xff0c;下一份工作如何选…