011 OpenCV warpAffine

news2024/11/24 13:53:38

目录

一、环境

二、warpAffine原理

三、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、warpAffine原理

warpAffine是OpenCV库中的一个函数,它用于执行二维仿射变换。这个函数接受一个输入图像和变换矩阵,并将输入图像应用到这个变换矩阵上。

仿射变换是一种几何变换,它保持了图像的平行性和面积不变性。在二维空间中,一个仿射变换可以用一个2x3的变换矩阵来表示。这个矩阵乘以输入图像的每个像素坐标,得到新的像素坐标。这样,每个像素都被映射到新的位置,形成输出图像。

仿射变换可以应用在各种场景中,比如图像恢复、图像增强、图像配准等等。warpAffine函数可以高效地计算这种变换,并且支持对输出图像的裁剪、填充和插值等操作。

在具体实现上,warpAffine函数首先会计算每个像素的新位置,然后根据插值方法(如线性插值或双线性插值)来计算新的像素值。这个新的像素值就是输出图像中对应像素的值。

需要注意的是,warpAffine函数只对灰度图像有效。如果输入是彩色图像,它将会被分解为三个灰度图像(红、绿、蓝通道),然后分别进行仿射变换。最后,这三个变换后的灰度图像会被合并成一个彩色图像。函数原型:

float angle = -45.0; // 旋转角度
Mat M = (Mat_<float>(2, 3) << cos(angle), -sin(angle), -src.cols / 2, sin(angle), cos(angle), src.rows / 2);

参数说明

  • src:输入图像,即需要进行变换的原始图像。
  • dst:输出图像,即经过仿射变换后的图像。
  • M:变换矩阵,用于指定图像的变换方式。该矩阵是一个2x3的浮点型矩阵,其中第一行表示x方向的缩放和旋转,第二行表示y方向的缩放和旋转。
  • dsize:输出图像的大小。如果为空,则输出图像的大小与输入图像相同。
  • flags:插值方法,用于计算输出图像中像素的值。可选值有INTER_LINEAR(双线性插值)、INTER_NEAREST(最近邻插值)等。默认值为INTER_LINEAR。
  • borderMode:边界处理模式,用于处理输入图像边界外的像素。可选值有BORDER_CONSTANT(边界外填充常数)、BORDER_REPLICATE(边界外复制边缘像素)等。默认值为BORDER_CONSTANT。
  • borderValue:边界处理模式下的填充值。当borderMode为BORDER_CONSTANT时,此参数有效。默认值为morphologyDefaultBorderValue()。

三、完整代码

from __future__ import print_function
import cv2 as cv
import numpy as np
import argparse

# 加载图片
parser = argparse.ArgumentParser(description='Code for Affine Transformations tutorial.')
parser.add_argument('--input', help='Path to input image.', default='data/lena.jpg')
args = parser.parse_args()
src = cv.imread(cv.samples.findFile(args.input))
if src is None:
    print('Could not open or find the image:', args.input)
    exit(0)
# 设置三对2D点,用于求映射矩阵
srcTri = np.array( [[0, 0], 
                    [src.shape[1] - 1, 0], 
                    [0, src.shape[0] - 1]] ).astype(np.float32)

dstTri = np.array( [[0, src.shape[1]*0.33], 
                    [src.shape[1]*0.85, src.shape[0]*0.25], 
                    [src.shape[1]*0.15, src.shape[0]*0.7]] ).astype(np.float32)
# 依据上述三对点求解映射矩阵
warp_mat = cv.getAffineTransform(srcTri, dstTri)
# 依据映射矩阵将原图进行位置映射(默认双线性插值)
warp_dst = cv.warpAffine(src, warp_mat, (src.shape[1], src.shape[0]))
# 将图像绕中心旋转,同上
center = (warp_dst.shape[1]//2, warp_dst.shape[0]//2)
angle = -50
scale = 0.6
rot_mat = cv.getRotationMatrix2D( center, angle, scale )
warp_rotate_dst = cv.warpAffine(warp_dst, rot_mat, (warp_dst.shape[1], warp_dst.shape[0]))
cv.imshow('Source image', src)
cv.imshow('Warp', warp_dst)
cv.imshow('Warp + Rotate', warp_rotate_dst)
cv.waitKey()

运行效果:

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

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

相关文章

【Linux 静态IP配置】

静态IP配置 1.NAT模式设置2.设置静态ip3.重启网络4.查看ip 1.NAT模式设置 首先设置虚拟机中NAT模式的选项&#xff0c;打开VMware&#xff0c;点击“编辑”下的“虚拟网络编辑器”&#xff0c;设置NAT参数 注意&#xff1a; VMware Network Adapter VMnet8保证是启用状态 …

针对近期大面积出现的小程序新用户登录不正常处理办法

原因是微信小程序需要更新协议规则 操作方法如下&#xff1a; 提交之后等待通过

麒麟信安联合牵头 | 国家关键领域信创行业产教融合共同体成立大会暨欧拉人才发展论坛盛大召开

11月24日&#xff0c;国家关键领域信创行业产教融合共同体成立大会暨欧拉人才发展论坛在长沙职业技术学院盛大召开。大会由湖南省教育厅、湖南省工业和信息化厅、长沙市人民政府指导&#xff0c;麒麟信安、长沙理工大学、长沙职业技术学院三家牵头单位主办&#xff0c;湖南欧拉…

01-Java集合之单向队列,如Collection接口,List接口,Set接口,Queue接口及其实现类的底层结构和特点

单列集合 特点 单列集合分为三大类 List类型的集合: 有序可重复 , 这种类型的集合的元素都有下标Set类型的集合: 无序不可重复 , 这种类型的集合的元素都没有下标Queue类型的集合: 先进先出(FIFO) , 只能一端进并且在另一端出的队列 Collection中能存放的元素: 没有使用泛型…

国家万亿资金助力城市生命线城市内涝积水监测系统

自2023年年初以来&#xff0c;我国多个地区遭遇了洪涝、干旱、台风、风雹等灾害的侵袭&#xff0c;部分地区灾情严重&#xff0c;经济损失较大。为应对灾后恢复重建工作的艰巨任务&#xff0c;本次国债将主要投向灾后恢复重建以及提升防灾减灾救灾能力。其中&#xff0c;将全面…

统信UOS安装Virtualbox虚拟机和Windows10系统

在UOS统信系统中部署Windows环境我可以通过安装虚拟机来实现&#xff0c;这也可以解决软件不适配带来的一些问题&#xff0c;当然对硬件配置也有一定的要求&#xff0c;不建议性能过低的设备使用。 接下来请按照以下步骤进行安装Virtualbox及Win10虚拟系统的设置。 1、安装Vi…

docker容器的生命周期管理常用命令

容器的生命周期管理命令 docker create &#xff1a;创建一个新的容器但不启动它 docker create nginx docker run :创建一个新的容器并运行一个命令 常用选项&#xff1a; 常用选项1. --add-host&#xff1a;容器中hosts文件添加 host:ip 映射记录 2. -a, --attach&#…

【论文阅读】ActiveNeRF:通过不确定性估计候选新视图

【论文阅读】ActiveNeRF: Learning where to See with Uncertainty Estimation Abstract1 Introduction3 Background4 NeRF with Uncertainty Estimation5 ActiveNeRF5.1 Prior and Posterior Distribution5.2 Acquisition Function5.3 Optimization and Inference 6 Experimen…

Redis面试题:Redis是单线程的,但是为什么还那么快?I/O多路复用模型

目录 面试官&#xff1a;Redis是单线程的&#xff0c;但是为什么还那么快&#xff1f; 面试官&#xff1a;能解释一下I/O多路复用模型&#xff1f; 面试官&#xff1a;Redis是单线程的&#xff0c;但是为什么还那么快&#xff1f; 候选人&#xff1a; 嗯&#xff0c;这个有几…

Robot Framework自动化测试(四)--- 分层思想

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【广州华锐互动】节约用水VR互动教育:身临其境体验水资源的珍贵!

随着技术的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术在许多领域得到了广泛应用。在节水宣传教育方面&#xff0c;VR技术也展现出了其独特的优势。与传统宣传教育方式相比&#xff0c;节约用水VR互动教育具有更加沉浸式、互动性和实践性的特点&#xff0c;能…

Java计算二叉树从根节点到叶子结点的最大路径和

要求从根节点到叶子结点的最大路径和&#xff0c;可以通过递归遍历二叉树来实现。对于二叉树中的每个节点&#xff0c;我们都可以考虑包含该节点的最大路径和。在递归的过程中&#xff0c;我们需要不断更新全局最大路径和。 具体的思路如下&#xff1a; 递归函数设计&#xff1…

【Python】python包相对导入问题及解决方案

报错信息 ImportError: attempted relative import with no known parent package 问题描述 在package目录下有a1.py文件和subpackage1目录。在subpackage1目录下有b1.py文件。现在b1.py文件中有这样一行代码&#xff1a;from …a1 import A1。在subpackage1目录下运行pytho…

Windows公网远程连接MongoDB数据库【无公网IP】

目录 前言 1. 安装数据库 2. 内网穿透 2.1 安装cpolar内网穿透 2.2 创建隧道映射 2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址 3.1 保留一个固定的公网TCP端口地址 3.2 配置固定公网TCP端口地址 3.3 测试固定地址公网远程访问 总结 前言 MongoDB是一个基…

案例033:基于微信小程序的商品展示系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

paddleocr笔记

PP-OCRv1 PP-OCR中&#xff0c;对于一张图像&#xff0c;需要完成以下3个步骤提取其中的文字信息&#xff1a; 使用文本检测方法&#xff0c;获取文本区域多边形信息&#xff08;PP-OCR中文本检测使用的是DBNet&#xff0c;因此获取的是四点信息&#xff09;。对上述文本多边形…

SpringBoot参数校验@Validated和@Valid的使用

1、Validated和Valid区别 Validated&#xff1a;可以用在类、方法和方法参数上。但是不能用在成员属性&#xff08;字段&#xff09;上Valid&#xff1a;可以用在方法、构造函数、方法参数和成员属性&#xff08;字段&#xff09;上 2、引入依赖 Spring Boot 2.3 1 之前&…

【Linux系统编程】操作系统详解(什么是操作系统?为什么会存在操作系统?设计操作系统的目的是什么?)

目录 一、前言 二、 什么是操作系统 &#x1f4a6;操作系统的引入 &#x1f4a6;操作系统的概念理解 &#x1f4a6;操作系统设计的目的与定位 &#x1f4a6;总结 二、操作系统之上之下分别有什么 三、深度理解操作系统的“管理” &#x1f4a6;场景理解 &#x1f4a6;操…

使用thymeleaf模板生成静态文件demo

一&#xff1a;pom.xml添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> <dependency><groupId>ognl</groupId><artifactId…

NJU操作系统公开课笔记(2)

上期目录&#xff1a; NJU操作系统公开课笔记&#xff08;1&#xff09;https://blog.csdn.net/jsl123x/article/details/134431343?spm1001.2014.3001.5501 目录 一.处理器与寄存器 二.中断 三.中断系统 四.进程 五.线程与多线程技术概述 六.处理器调度算法 一.处理器…