【OpenCV】针对图像或点、向量的透视变换操作

引言

在使用OpenCV处理图像时,我们经常需要使用到透视变换操作来矫正图像的面,使其具有相对统一的显示方式,以方便后续对图像的各种处理。

相关函数

cv::getPerspectiveTransform:获取透视变换/投影变换矩阵
cv::findHomography:计算单应性矩阵

cv::warpPerspective:对整幅图像进行透视变换/投影变换
cv::perspectiveTransform:对一组点进行透射变换/投影变换

cv::getPerspectiveTransform

函数作用:根据输入和输出点获得图像透视变换的矩阵

函数的调用形式:Mat getPerspectiveTransform(InputArray src, InputArray dst)

InputArray src, InputArray dst:分别为变换的输入和输出点

小记:该函数通过已知四点坐标,计算得到透视变换矩阵。即生成将src中的点透视变换到dst中对应点的矩阵。当你明确知道变化前后的四点坐标的话,使用getPerspectiveTransform是非常有效的,findHomography是在无法明确知道变换坐标的时候,进行运算得到变换矩阵。

cv::findHomography

函数功能:找到两个平面之间透视变换的矩阵。

函数的调用形式:

Mat cv::findHomography ( InputArray srcPoints,
                         InputArray dstPoints,
                         int method = 0,
                         double ransacReprojThreshold = 3,
                         OutputArray mask = noArray(),
                         const int maxIters = 2000,
                         const double confidence = 0.995
                         )

srcPoints:源平面中点的坐标矩阵,可以是CV_32FC2类型,也可以是vector<Point2f>类型

dstPoints:目标平面中点的坐标矩阵,可以是CV_32FC2类型,也可以是vector<Point2f>类型

method: 计算单应矩阵所使用的方法。不同的方法对应不同的参数,具体如下:

  • 0 - 利用所有点的常规方法
  • RANSAC - RANSAC-基于RANSAC的鲁棒算法
  • LMEDS - 最小中值鲁棒算法
  • RHO - PROSAC-基于PROSAC的鲁棒算法

ransacReprojThreshold:将点对视为内点的最大允许重投影错误阈值(仅用于RANSAC和RHO方法)。若srcPoints和dstPoints是以像素为单位的,则该参数通常设置在1到10的范围内。

mask:可选输出掩码矩阵,通常由鲁棒算法(RANSAC或LMEDS)设置。 请注意,输入掩码矩阵是不需要设置的。

maxIters: RANSAC算法的最大迭代次数,默认值为2000。

confidence: 可信度值,取值范围为0到1.

小记:注意findHomography不需要输入输出的两个矩阵中的点两两对应。

cv::warpPerspective

函数功能:通过输入变换矩阵得到透视图片。

函数的调用形式:

void cv::warpPerspective(InputArray src,
		         OutputArray dst,
		         InputArray M,
		         Size dsize,
		         int flags = INTER_LINEAR,
		         int borderMode = BORDER_CONSTANT,
		         const Scalar &borderValue = Scalar() 
		         )

src:输入图片

dst:输出图片

M:输入的透视变换矩阵,大小是3*3

dsize:输出图片的大小

flags:插值方法(INTER_LINEAR或INTER_NEAREST)与可选标志WARP_INVERSE_MAP的组合,将M设置为逆变换(𝚍𝚜𝚝→𝚜𝚛𝚌)。

borderMode:边界像素赋值操作(BORDER_CONSTANT or BORDER_REPLICATE),前者是定值,后者是复制周围像素。

borderValue:指定定值具体是那个值,默认是0

小记:M为调用 getPerspectiveTransform 或 perspectiveTransform 生成的透视变换矩阵。warpPerspective操作的是Mat图像。

cv::perspectiveTransform

函数功能:通过输入变换矩阵得到透视变换后的点坐标

函数形式:void perspectiveTransform(InputArray src, OutputArray dst, InputArray M)

src:输入点(数组)

dst:输出点(数组)

M:输入的透视变换矩阵,大小是3*3或4*4

小记:M为调用 getPerspectiveTransform 或 perspectiveTransform 生成的透视变换矩阵。perspectiveTransform操作的是点坐标。

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注