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 (可选) 计算矩阵的方法。默认是 0DECOMP_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());

点击顶部【下载】按钮,可以获取源代码

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐