c# OpenCV入门基础 图像透视变换 Cv2.WarpPerspective
OpenCV提供了透视变换功能,主要包含两个核心函数: GetPerspectiveTransform:通过源图像和目标图像的4个对应点(Point2f数组)计算3x3透视变换矩阵,默认使用LU分解法求解。 WarpPerspective:应用变换矩阵对图像进行透视变换,可指定输出尺寸、插值方法(如双线性插值)、边界填充模式(如常量填充黑色)等参数。 典型应用场景是将倾斜拍摄的四边形区域(如文档)
·
1. Cv2.GetPerspectiveTransform - 计算透视变换矩阵
这个函数用于计算从源图像四个点(通常是四边形)到目标图像四个对应点的透视变换矩阵(3x3)。
public static Mat GetPerspectiveTransform(
InputArray src,
InputArray dst,
int solveMethod = 0
)
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
src |
InputArray |
源点坐标。通常是一个 Point2f[] 数组,包含原始图像上四边形的四个角点。必须精确包含4个点,顺序通常为左上、右上、右下、左下。 |
dst |
InputArray |
目标点坐标。与 src 对应的目标坐标,也是一个 Point2f[] 数组,包含4个点。它定义了 src 中的点应该被映射到输出图像中的哪个位置。 |
solveMethod |
int |
(可选) 计算矩阵的方法。默认是 0(DECOMP_LU)。通常不需要更改,除非有特殊数值计算需求。可以传递 Cv2.DecoCompTypes 中的枚举值,如 DecompTypes.LU。 |
返回值:
一个 3x3 的 Mat 矩阵,这就是计算得到的透视变换矩阵(M)。
2. Cv2.WarpPerspective - 应用透视变换
这个函数使用由 GetPerspectiveTransform 计算得到的变换矩阵,对整个源图像进行透视变换。
public static void WarpPerspective(
InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
InterpolationFlags flags = InterpolationFlags.Linear,
BorderTypes borderMode = BorderTypes.Constant,
Scalar borderValue = default
)
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
src |
InputArray |
输入图像。要进行变换的源图像(Mat)。 |
dst |
OutputArray |
输出图像。存储变换后结果的图像(Mat)。它的尺寸由 dsize 参数决定。 |
M |
InputArray |
变换矩阵。一个 3x3 的透视变换矩阵,通常来自 GetPerspectiveTransform 的返回值。 |
dsize |
Size |
输出图像的大小。例如 new Size(300, 400)。这定义了变换后图像的宽度和高度。 |
flags |
InterpolationFlags |
(可选) 插值方法。默认是 InterpolationFlags.Linear(双线性插值)。常见选项:- InterpolationFlags.Linear: 最常用,质量和速度平衡。- InterpolationFlags.Nearest: 最近邻插值,速度快但可能有锯齿。- InterpolationFlags.Cubic 等:更高质量的插值,速度更慢。 |
borderMode |
BorderTypes |
(可选) 像素外推方法。默认是 BorderTypes.Constant(用常数值填充边界)。常见选项:- BorderTypes.Constant: 用 borderValue 填充。- BorderTypes.Replicate: 复制最边缘的像素。- BorderTypes.Reflect: 反射图像边界。 |
borderValue |
Scalar |
(可选) 边界填充值。当 borderMode 为 BorderTypes.Constant 时,用于填充空白区域的颜色。默认是黑色 (0, 0, 0)。例如,如果想填充白色,可以设置为 new Scalar(255, 255, 255)。 |
示例

变换原理:如下图,绿色区域为图像局部透视区域,将局部透视区域转换为正视区域。

核心代码:
Mat src = Cv2.ImRead(sourceFile, ImreadModes.Unchanged);
List<OpenCvSharp.Point2f> lstSrc = new List<Point2f>();
List<OpenCvSharp.Point2f> lstDst = new List<Point2f>();
//原图上的4个点
lstSrc.Add(new Point2f() { X = 466, Y = 202 });
lstSrc.Add(new Point2f() { X = 754, Y = 135 });
lstSrc.Add(new Point2f() { X = 466, Y = 356 });
lstSrc.Add(new Point2f() { X = 754, Y = 404 });
//纠正后的位置
lstDst.Add(new Point2f() { X = 0, Y = 0 });
lstDst.Add(new Point2f() { X = src.Width, Y = 0 });
lstDst.Add(new Point2f() { X = 0, Y = src.Height });
lstDst.Add(new Point2f() { X = src.Width, Y = src.Height });
Mat ttMat = Cv2.GetPerspectiveTransform(lstSrc, lstDst);
Mat dst = new Mat();
Cv2.WarpPerspective(src, dst, ttMat, src.Size());
点击顶部【下载】按钮,可以获取源代码
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)