引言
在使用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操作的是点坐标。