【OpenCV 对图片做旋转操作】仿射=旋转+平移+缩放+剪切
OpenCV 中的旋转相关函数详解
OpenCV 提供了多种函数用于图像的旋转操作,主要分为 任意角度旋转 和 固定角度旋转。以下是常用函数及详细使用说明:
一、任意角度旋转
1. cv2.getRotationMatrix2D()
生成旋转矩阵,用于定义旋转参数。
函数原型:
cv2.getRotationMatrix2D(center, angle, scale) -> M
- 参数说明:
center:旋转中心坐标(x, y),通常为图像中心(width/2, height/2)。angle:旋转角度(顺时针方向,单位为度)。scale:缩放因子(1.0 表示不缩放)。
- 返回值:2x3 的仿射变换矩阵
M。
2. cv2.warpAffine()
应用旋转矩阵对图像进行仿射变换。
函数原型:
cv2.warpAffine(src, M, dsize[, dst, flags, borderMode, borderValue]) -> dst
- 关键参数:
M:旋转矩阵(来自cv2.getRotationMatrix2D)。dsize:输出图像尺寸(width, height)。若未指定,默认与原图尺寸相同(可能裁剪内容)。flags:插值方法(如cv2.INTER_LINEAR)。borderMode:边界填充模式(如cv2.BORDER_CONSTANT)。borderValue:填充颜色(默认为黑色)。
完整代码示例:
import cv2
import numpy as np# 读取图像
img = cv2.imread('image.jpg')
h, w = img.shape[:2]# 计算旋转中心
center = (w // 2, h // 2)# 生成旋转矩阵(顺时针旋转45度,无缩放)
M = cv2.getRotationMatrix2D(center, angle=45, scale=1.0)# 计算旋转后的图像尺寸(避免裁剪)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
new_w = int((h * sin) + (w * cos))
new_h = int((h * cos) + (w * sin))
M[0, 2] += (new_w / 2) - center[0] # 调整平移参数
M[1, 2] += (new_h / 2) - center[1]# 应用旋转
rotated = cv2.warpAffine(img, M, (new_w, new_h), flags=cv2.INTER_LINEAR, borderValue=(255, 255, 255))cv2.imshow('Rotated Image', rotated)
cv2.waitKey(0)
二、固定角度旋转
cv2.rotate()
快速实现 90°、180°、270° 的旋转(无需手动计算矩阵)。
函数原型:
cv2.rotate(src, rotateCode[, dst]) -> dst
- 参数说明:
rotateCode:旋转模式:cv2.ROTATE_90_CLOCKWISE:顺时针旋转90度。cv2.ROTATE_180:旋转180度。cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转90度(等效于顺时针270度)。
代码示例:
# 顺时针旋转90度
rotated_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
三、关键问题与优化
1. 旋转后的黑边处理
旋转可能导致图像边缘出现黑色填充。可通过以下方式优化:
- 自定义填充颜色:设置
borderValue参数(如白色填充)。rotated = cv2.warpAffine(img, M, (new_w, new_h), borderValue=(255, 255, 255)) - 图像扩展模式:使用
borderMode=cv2.BORDER_REPLICATE复制边缘像素。
2. 旋转后的图像尺寸控制
- 自动计算新尺寸(避免裁剪):
new_w = int(w * |cosθ| + h * |sinθ|) new_h = int(w * |sinθ| + h * |cosθ|) - 保持原图尺寸(可能裁剪内容):
rotated = cv2.warpAffine(img, M, (w, h))
3. 插值方法选择
cv2.INTER_NEAREST:最近邻插值(速度快,锯齿明显)。cv2.INTER_LINEAR:双线性插值(平衡速度与质量,默认)。cv2.INTER_CUBIC:双三次插值(质量高,速度慢)。
四、复合变换(旋转+平移)
若需同时旋转和平移,可直接修改旋转矩阵的平移分量:
M = cv2.getRotationMatrix2D(center, angle=30, scale=1.0)
M[0, 2] += 50 # 沿x轴正方向平移50像素
M[1, 2] += -20 # 沿y轴负方向平移20像素
五、总结
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
cv2.getRotationMatrix2D | 任意角度旋转,可自定义中心和缩放 | 灵活,支持复杂变换 | 需手动处理尺寸和黑边 |
cv2.rotate | 90°、180°、270° 的快速旋转 | 简单高效,无需计算矩阵 | 仅支持固定角度 |
根据需求选择合适的函数,并通过调整参数优化旋转效果。
相关文章:
【OpenCV 对图片做旋转操作】仿射=旋转+平移+缩放+剪切
OpenCV 中的旋转相关函数详解 OpenCV 提供了多种函数用于图像的旋转操作,主要分为 任意角度旋转 和 固定角度旋转。以下是常用函数及详细使用说明: 一、任意角度旋转 1. cv2.getRotationMatrix2D() 生成旋转矩阵,用于定义旋转参数。 函数原…...
【browser-use+deepseek】实现简单的web-ui自动化
browser-use Web-UI 一、browser-use是什么 Browser Use 是一款开源Python库,专为大语言模型设计的智能浏览器工具,目的是让 AI 能够像人类一样自然地浏览和操作网页。它支持多标签页管理、视觉识别、内容提取,并能记录和重复执行特定动作。…...
django数据迁移操作受阻
错误信息: django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根据错误信息分析,该问题是由于MySQL用户 缺乏SYSTEM_VARI…...
MOS管的发热原因和解决办法
发热来源 如上图,MOS管的工作状态有4种情况,分别是开通过程,导通过程,关断过程和截止过程。 导致发热的损耗主要有两种:开关损耗、导通损耗。 导通损耗 导通损耗比较好计算,根据驱动电压VGS值可以得到MOS…...
4月11日随笔
本来以为大风会很厉害,本来今天早八的微积分不想去了。但是起床发现并没有很大的风,还是去了。 中午回来的路上突然变天,雷阵雨转冰雹。下了大概半小时,所幸挨淋的不是很严重。 中午打了首胜,AI的基本弄完了…...
科技项目验收测试怎么做?验收测试报告如何获取?
科技项目从研发到上市需要一个很长的周期,并且在上市之前还有一个至关重要的交付过程,那就是项目验收,验收需要通过验收测试来呈现。科技项目验收测试是确保项目成功交付的关键步骤,那么是如何进行的呢?企事业单位想要获取科技项…...
Java面试黄金宝典45
1. 非对称加密 RSA 定义:RSA 是一种广泛使用的非对称加密算法,其安全性基于大整数分解的困难性。它使用一对密钥,即公钥和私钥。公钥可公开用于加密消息,而私钥必须保密,用于解密由相应公钥加密的消息。要点: 公钥公开,私钥保密,二者成对出现。加密和解密使用不同的密钥…...
计算机网络学习前言
前言 该部分说明计算机网络是什么?它有什么作用和功能?值不值得我们去学习?我们该如何学习?这几个部分去大概介绍计算机网络这门课程,往后会介绍计算机网络的具体知识点。 1.计算机网络是什么? 计算机网…...
Vuex 源码
以下是关于 Vuex 源码 的系统梳理: 一、Vuex 核心架构设计 1. 整体架构分层 #mermaid-svg-Eqqp2jldNkQwvgcr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Eqqp2jldNkQwvgcr .error-icon{fill:#552222;}#mermaid…...
AutoEval:现实世界中通才机器人操作策略的自主评估
25年3月来自 UC Berkeley 和 Nvidia 的论文“AutoEval: Autonomous Evaluation of Generalist Robot Manipulation Policies in the Real World”。 可规模化且可复现的策略评估一直是机器人学习领域长期存在的挑战。评估对于评估进展和构建更优策略至关重要,但在现…...
IP组播技术与internet
1.MAC地址分为三类:广播地址;组播地址;单播地址 2.由一个源向一组主机发送信息的传输方式称为组播。 3.组播MAC地址,第一个字节的最后一位为1; 单播MAC地址,第一个字节的最后一位为0; 4.不能…...
基于SSM框架的房屋租赁小程序开发与实现
概述 一个基于SSM框架开发的微信小程序房屋租赁管理系统,该项目实现了用户管理、中介管理、房源信息管理等核心功能。 主要内容 一、管理员模块功能实现 用户管理 管理员可对通过微信小程序注册的用户信息进行修改和删除操作,确保用户数据的准…...
oracle 表空间(Tablespace)
在 Oracle 11g 中,表空间(Tablespace) 是数据库存储架构的核心逻辑单元,其原理基于 逻辑存储与物理存储的分离,通过分层管理数据文件、段(Segment)、区(Extent)和数据块&…...
基于YOLOv8的机场跑道异物检测识别系统:提升航空安全的新一代解决方案(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 机场跑道异物检测领域概述 机场跑道异物(Foreign Object Debris, FOD)是指存在于机场跑道、滑行道等关…...
23种设计模式生活化场景,帮助理解
以下是 23种设计模式的生活化场景 及其核心对比,通过日常例子和比喻帮助理解它们的本质区别和应用场景: 创建型模式(5种) 1. 工厂方法(Factory Method) • 场景:快餐店的点餐系统。 • 问题&a…...
Android学习总结之OKHttp拦截器和缓存
深入理解 OkHttp 拦截器 1. 拦截器接口详解 Interceptor 接口是自定义拦截器的基础,它仅包含一个抽象方法 intercept。以下是对该方法参数和返回值的详细解释: import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import…...
Wincc管对象的使用
Wincc管对象的使用 管对象的调用多边形管T形管双T形管管弯头管道大小调整 管对象的调用 打开【图形编辑器】 多边形管 多边形管如下: 一根管子的顶点数是两个,如果修改顶点数,管子就有多少个端点。 修改顶点数为5 此时点击端点然后拖动&#…...
Linux-----驱动
一、内核驱动与启动流程 1. Linux内核驱动 Nor Flash: 可线性访问,有专门的数据及地址总线(与内存访问方式相同)。 Nand Flash: 不可线性访问,访问需要控制逻辑(软件)。 2. Linux启动流程 ARM架构: IRAM…...
GHG认证是什么,GHG认证的意义?对企业发展好处
GHG认证(温室气体认证)详解 GHG认证(Greenhouse Gas Certification,温室气体认证)是指对组织、产品或项目的温室气体(GHG)排放量进行科学量化、报告,并由第三方机构进行独立核查和认…...
Docker 常用命令指南
Docker 提供了丰富的命令行工具来管理镜像、容器、网络和数据卷等资源。本指南按类别整理 Docker 的常用命令,并为每个命令提供简体中文说明和示例,以帮助您快速查询和掌握日常使用。 1. 镜像管理 Docker 镜像(Image)是打包好的应用程序及其依赖环境,可用于创建容器。常用…...
问问lua怎么写DeepSeek,,,,,
很坦白说,这十年,我几乎没办法从互联网找到这个这样的代码,互联网引擎找不到,我也没有很大的“追求”要传承,或者要宣传什么;直到DeepSeek的出现 兄弟,Deepseek现在已经比你更了解你楼下的超市…...
基于神经环路的神经调控可增强遗忘型轻度认知障碍患者的延迟回忆能力
简要总结 这篇文章提出了一种名为CcSi-MHAHGEL的框架,用于基于多站点、多图谱fMRI的功能连接网络(FCN)分析,以辅助自闭症谱系障碍(ASD)的识别。该框架通过多视图超边感知的超图嵌入学习方法,整合…...
C++学习之ORACLE③
1.集合运算符 查询部门号是10和20的员工信息: ?思考有几种方式解决该问题 ? SQL> select * from emp where deptno in(10, 20) SQL> select * from emp where deptno10 or deptno20 集合运算: Select * from emp …...
UniAD:自动驾驶的统一架构 - 创新与挑战并存
引言 自动驾驶技术正经历一场架构革命。传统上,自动驾驶系统采用模块化设计,将感知、预测和规划分离为独立组件。而上海人工智能实验室的OpenDriveLab团队提出的UniAD(Unified Autonomous Driving)则尝试将这些任务整合到一个统一…...
transformers 中的 input_ids 和 labels 是什么
transformers 中的 input_ids 和 labels 是什么 input_ids 是输入文本的数字化表示,而 labels 是模型训练的目标值 在自然语言处理(NLP)和使用 transformers 库进行模型训练时,tokenizer = AutoTokenizer.from_pretrained(model_path) 这行代码是用于从预训练模型路径加载…...
各种排序思路及实现
目录 1.排序概念常见的排序算法 2.常见排序算法实现(1)插入排序直接插入排序希尔排序(缩小增量排序) (2)选择排序直接选择排序堆排序 (3)交换排序冒泡排序快速排序(hoare…...
golang 采用use-go/onvif获取RTSP流
采用https://github.com/use-go/onvif得到完整的RTSP流的地址 全局变量UseGoMain 函数GetDeviceInformation 函数GetRTSPUri 函数 全局变量 这些变量用来设定 ONVIF 设备的连接信息,包含设备地址、用户名和密码 var deviceXaddr "*92.1*8.11*.12*:80" …...
虚幻基础:碰撞帧运算
能帮到你的话,就给个赞吧 😘 文章目录 碰撞碰撞盒线段检测 帧运算:每个程序流就是一帧的计算结果速度过快时(10000),导致每帧移动过大(83),从而导致碰撞盒错过而没有碰撞速度快的碰撞要用线段检测 碰撞 碰撞盒 线段检…...
【北京市小客车调控网站-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
西湖大学团队开源SaProt等多款蛋白质语言模型,覆盖结构功能预测/跨模态信息搜索/氨基酸序列设计等
2025 年 3 月 22—23 日,上海交通大学「AI 蛋白质设计峰会」正式举行。 本次峰会汇聚了来自清华大学、北京大学、复旦大学、浙江大学、厦门大学等知名高校的 300 多位专家学者,以及 200 余位行业领军企业代表和技术研发人员,深入探讨了 AI 在…...
