cv2.getAffineTransform()简要介绍

先了解cv2.warpAffine()+cv2.getRotationMatrix2D()

定义

cv2.getAffineTransform(pts1,pts2)

用法

仿射变换,指一个向量空间进行线性变换+平移变成另外一个向量空间,它需要一个变换矩阵,而由于仿射变换较为复杂,一般很难找出这个矩阵,于是opencv提供了cv2.getAffineTransform()

cv2.getAffineTransForm()通过找图像中三个点的坐标和变换图像的相应三个点坐标,创建一个2X3的矩阵。最后这个矩阵会被传给函数cv2.warpAffine()

cv2.getAffineTransform( pts1 , pts2)
函数作用构建变换矩阵
pts1原图像三个点的坐标
pts2原图像三个点在变换后相应的坐标

示例

import cv2 
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('D:/3.png') 
rows,cols,ch = img.shape 

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])  
M = cv2.getAffineTransform(pts1,pts2)

dst = cv2.warpAffine(img,M,(cols,rows)) 

plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('output')
plt.show()

效果图

### 使用 OpenCV 和 NumPy 进行基于 2x3 矩阵的二维图像变换 在计算机视觉领域,OpenCV 提供了一种简单而有效的方法来执行几何变换。对于仿射变换,可以利用 `cv.getAffineTransform` 创建一个 2x3 的转换矩阵,并将其应用于图像以实现各种几何操作。 #### 什么是仿射变换? 仿射变换是一种保持直线和平行性的几何变换,在这种变换中,原始图像中的所有平行线在输出图像中仍然保持平行[^1]。为了定义这样的变换,通常需要指定输入图像上的三个点及其对应的输出位置。 以下是具体的操作流程: --- #### 示例代码展示 下面提供了一个完整的 Python 示例,演示如何通过 OpenCV 和 NumPy 实现基于 2x3 矩阵的仿射变换。 ```python import cv2 import numpy as np # 加载图像 image = cv2.imread('example.jpg') # 获取图像的高度和宽度 rows, cols, _ = image.shape # 定义输入图像中的三点坐标 pts_src = np.float32([[50, 50], [200, 50], [50, 200]]) # 定义目标图像中的对应三点坐标 pts_dst = np.float32([[10, 100], [200, 50], [100, 250]]) # 计算仿射变换矩阵 M = cv2.getAffineTransform(pts_src, pts_dst) # 应用仿射变换到原图上 result = cv2.warpAffine(image, M, (cols, rows)) # 展示结果 cv2.imshow("Original Image", image) cv2.imshow("Transformed Image", result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码实现了以下功能: - **加载图像**:使用 `cv2.imread()` 方法读取一张名为 `'example.jpg'` 的图片。 - **定义映射关系**:分别设置源图像 (`pts_src`) 和目标图像 (`pts_dst`) 中的关键点坐标。 - **计算变换矩阵**:调用 `cv2.getAffineTransform()` 来生成所需的 2x3 变换矩阵。 - **应用变换**:借助 `cv2.warpAffine()` 将变换矩阵作用于整个图像[^2]。 --- #### 关键概念解析 1. **仿射变换的核心原理** - 需要至少三组匹配点对才能唯一确定一个 2x3 的仿射变换矩阵。 - 此类变换适用于处理诸如倾斜校正、视角调整等问题。 2. **NumPy 数据结构的作用** - 所有的关键点都存储为浮点型数组(`np.float32`),这是 OpenCV API 对数据类型的要求之一。 3. **函数说明** - `cv2.getAffineTransform`: 接收两组点集作为输入并返回相应的变换矩阵。 - `cv2.warpAffine`: 利用预计算好的矩阵完成实际的空间重定位过程。 --- #### 注意事项 - 输入图像应为灰度或 BGR 格式的 ndarray 数组[^5]。 - 若需进一步扩展至透视投影,则可考虑采用 `cv.getPerspectiveTransform` 和 `cv.warpPerspective` 替代当前方案[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值