透视变换
date created: 2026-9-23 21:42 date modified: 2026-9-23 21:42
OpenCV 透视变换三函数笔记
1. cv2.getPerspectiveTransform
功能:由 4 对对应点计算 3×3 透视变换矩阵。
H = cv2.getPerspectiveTransform(src, dst)
| 项目 | 说明 |
|---|---|
输入 src |
源图像上的 4 个点,形状 (4,1,2) 或 (4,2),float32 |
输入 dst |
目标图像上的 4 个点,形状同上 |
输出 H |
3×3 矩阵,float64 |
| 方向 | dst = H · src(齐次坐标) |
| 注意 | 点顺序要一致,通常:左上、右上、右下、左下 |
2. cv2.warpPerspective
功能:对整张图像做透视变换。
warped = cv2.warpPerspective(src, M, dsize, flags=cv2.INTER_LINEAR)
| 项目 | 说明 |
|---|---|
输入 src |
原始图像 |
输入 M |
3×3 变换矩阵,一般传 H |
输入 dsize |
输出尺寸,格式 (width, height) |
输入 flags |
插值方式,默认 INTER_LINEAR;加 WARP_INVERSE_MAP 表示 M 是目标→源 |
| 输出 | 变换后的图像,尺寸为 dsize |
| 方向 | 默认 M 是源→目标,OpenCV 内部反查采样 |
| 注意 | dsize 是 (宽, 高),不是 (高, 宽) |
3. cv2.perspectiveTransform
功能:对一组点做透视变换。
pts_dst = cv2.perspectiveTransform(pts_src, M)
| 项目 | 说明 |
|---|---|
输入 pts_src |
点集,形状 (N,1,2) 或 (1,N,2),float32 / float64 |
输入 M |
3×3 变换矩阵 |
输出 pts_dst |
变换后的点集,形状同输入 |
| 方向 | pts_dst = M · pts_src(齐次后归一化) |
| 注意 | 输入必须是浮点型;输出也是浮点,画图前转 int |
方向与逆矩阵
H = cv2.getPerspectiveTransform(src, dst) # 原图 → 标准图
H_inv = cv2.getPerspectiveTransform(dst, src) # 标准图 → 原图
# 或 H_inv = np.linalg.inv(H)
H:原图坐标 → 标准图坐标H_inv逆矩阵:标准图坐标 → 原图坐标
典型用法:
# 原图找地图角点 → 算 H
H = cv2.getPerspectiveTransform(src, dst)
H_inv = cv2.getPerspectiveTransform(dst, src)
# 整图矫正,得到标准图
warped = cv2.warpPerspective(frame, H, (W, H))
# 在 warped 上识别角色,得到标准图坐标 pts_std
# 把点映射回原图
pts_orig = cv2.perspectiveTransform(pts_std, H_inv)
# 在原图上画
for (x, y) in pts_orig.reshape(-1, 2):
cv2.circle(frame, (int(x), int(y)), 5, (0,0,255), -1)
一句话:getPerspectiveTransform 算矩阵,warpPerspective 变整图,perspectiveTransform 变点集。
原图→标准图用 H,标准图→原图用 H_inv。
留言区
不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。