【opencv】几何变换——投影变换(2 计算投影变换矩阵getPerspectiveTransform(src,dst))

该代码示例展示了如何使用OpenCV的getPerspectiveTransform函数计算投影变换矩阵。首先,定义了原始坐标和变换后的坐标,然后无论是通过Point2f数组还是4x2的Mat矩阵,都能计算得到投影变换矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2 计算投影变换矩阵

  • 返回的投影矩阵数据类型是CV_64F

2.1将坐标位置保存在Point2f数组中

#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
    //原坐标
    Point2f src[] = { Point2f(0,0),Point2f(200.0,0), Point2f(0,200.0), Point2f(200,200) };
    //经过投影变换后的坐标
    Point2f dst[] = { Point2f(100,20),Point2f(200,20),Point2f(50,70),Point2f(250,70) };
    //计算投影变换矩阵
    Mat P = getPerspectiveTransform(src, dst);
    cout << P << endl;
}

在这里插入图片描述

2.2将坐标位置保存在4x2的Mat中

#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
    //原坐标
    Mat src=(Mat_<float>(4,2)<<0,0,200,0,0,200,200,200);
    //经过投影变换后的坐标
    Mat dst = (Mat_<float>(4, 2) << 100, 20, 200, 20, 50, 70, 250, 70);
    //计算投影变换矩阵
    Mat P = getPerspectiveTransform(src, dst);
    cout << P << endl;
}

在这里插入图片描述

### 透视变换、投影变换及单应性矩阵概述 透视变换(Perspective Transformation),也称为Homography Transformation,在计算机视觉领域扮演着重要角色[^1]。此变换允许将一个平面内的点映射至另一个视角下的对应位置,广泛应用于图像校正、增强现实等领域。 #### 单应性矩阵特性 单应性矩阵是描述上述转换的核心工具之一,其本质在于建立源图与目标图间的关系模型。具体而言,该矩阵能表达包括旋转、缩放和平移在内的多种操作组合效果[^3]。值得注意的是,当仅考虑二维空间内物体的姿态改变而不涉及深度信息时,可通过此类变换实现较为精确的位置调整;然而一旦涉及到不同景深对象间的相互关系,则需引入更为复杂的三维重建技术来补充说明。 对于单应性矩阵H来说,给定一对匹配点集{(xi, yi)} 和 {(ui, vi)}, 可以构建如下方程组: \[ \begin{bmatrix} u \\ v \\ 1\end{bmatrix}= H * \begin{bmatrix} x\\ y\\ 1\end{bmatrix}\] 这里\(u,v\)代表目标图片上的坐标而 \(x,y\) 则来源于原始输入图像。由于存在齐次性质,因此实际求解过程中通常会采用最小二乘法或其他优化策略寻找最优参数配置方案[^2]。 #### Python 实现示例 利用 OpenCV 库可以方便快捷地完成基于单应性的图像变形任务。下面给出一段简单的代码片段展示如何计算并应用单应性矩阵来进行透视矫正: ```python import cv2 import numpy as np def compute_homography(src_pts,dst_pts): h_matrix,_ = cv2.findHomography(np.array([src_pts]),np.array([dst_pts])) return h_matrix if __name__ == "__main__": src_points = [[56,65],[368,52],[28,387],[389,390]] # 原始四角顶点坐标列表 dst_points = [[0,0], [300,0], [0,300], [300,300]] # 目标矩形区域四个角落位置 homography_mat = compute_homography(src_points,dst_points) img = cv2.imread('input_image.jpg') warped_img = cv2.warpPerspective(img,homography_mat,(300,300)) cv2.imshow("Warped Image",warped_img) cv2.waitKey(0) ``` 这段程序首先定义了一个辅助函数`compute_homography()`用于接收两组对应的控制点集合,并调用内置API获取相应的单应性矩阵。之后读取待处理文件路径指定的原图数据,再经由`cv2.warpPerspective()`执行具体的重映射过程得到最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值