cv2.findHomography()函数介绍:
cv2.findHomography() 是 OpenCV 中的一个函数,用于找到两个图像之间的单应性矩阵(Homography matrix)。在计算机视觉中,单应性矩阵是一个3x3的矩阵,它描述了两个平面之间的相对位置关系,通常用于图像配准、图像拼接、全景图像生成等应用中。
## findHomography(srcPoints,dstPoints, method=None, ransacReprojThreshold=None, mask=NO
#计算视角变换矩阵,透视变换函数,与cv2.getPerspectiveTransform()的区别在与可多个数据点变换
#参数srcPoints:图片B的匹配点坐标
#参数dstPoints:图片A3的匹配点坐标
# 参数method:计算变换矩阵的方法。
# 0- 使用所有的点,最小二乘
# RANSAC-基于随机样本一致性,见https://zhuanlan.zhihu.com/p/402727549
# LMEDS - 最小中值
# RHO-基于渐近样本一致性
# ransacReprojThreshold:最大允许重投影错误阈值。该参数只有在method参数为RANSAC与RHO的时启用,默认
# #返回值:中H为变换矩阵,mask是掩模标志
函数原型
cv2.findHomography(srcPoints, dstPoints, method=cv2.RANSAC, ransacReprojThreshold=3, mask=None, maxIters=2000, confidence=0.995)
参数说明
- srcPoints:源图像中的点集,类型为np.float32的N x 1 x 2或者N x 2数组(其中N是点的数量)。
- dstPoints:目标图像中的点集,类型和srcPoints相同,且点的数量和顺序需要与srcPoints一一对应。
- method:计算单应性矩阵的方法。可以是以下值之一:
-
- cv2.RANSAC:基于RANSAC(Random Sample Consensus)算法的鲁棒方法(常用)。
-
- cv2.LMEDS:最小中值鲁棒估计法。
-
- 0:常规方法,使用所有点的最小二乘法,不推荐在有异常值时使用。
-
- cv2.RHO:基于PROSAC的鲁棒方法。
- ransacReprojThreshold:仅在使用RANSAC方法时有用,表示一个点到对应点的投影之间的最大允许距离,以此来判断是否为内点(即,用于计算单应性矩阵的点)。这个阈值用于RANSAC算法中,单位是像素。
- mask:可选的输出掩码,将是一个8位单通道的数组,表示每个点是否为内点(用于计算单应性矩阵的点)。
- maxIters:RANSAC算法的最大迭代次数,默认值为2000。
- confidence:RANSAC算法中,模型被接受所需要的置信度(概率),默认值为0.995。
- refineMethod:用于优化单应性矩阵的方法,可以是cv2.LMEDS或cv2.RANSAC。
- status:可选的输出数组,表示每个点是否被成功匹配。
返回值
- retval:返回计算得到的3x3单应性矩阵。
- mask:如果提供了该参数,函数会填充这个数组,表示每个点是否为内点。
使用示例
以下是一个使用 cv2.findHomography() 的示例,演示如何计算和应用单映射矩阵:
import cv2
import numpy as np
# 定义源图像和目标图像中的对应点
src_points = np.array([[100, 100], [200, 100], [200, 200], [100, 200]], dtype=np.float32)
dst_points = np.array([[150, 150], [250, 150], [250, 250], [150, 250]], dtype=np.float32)
# 计算单映射矩阵
H, mask = cv2.findHomography(src_points, dst_points, cv2.RANSAC, 5.0)
# 应用单映射矩阵进行透视变换
img = cv2.imread('source.jpg')
height, width = img.shape[:2]
warped_img = cv2.warpPerspective(img, H, (width, height))
# 显示结果
cv2.imshow('Warped Image', warped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
解释
定义源点和目标点
:在源图像和目标图像中定义四组对应的点。计算单映射矩阵
:使用 cv2.findHomography() 计算单映射矩阵 H。应用透视变换
:使用 cv2.warpPerspective() 函数和计算出的单映射矩阵 H 对源图像进行透视变换,从而将源图像中的对应点映射到目标图像中的位置。显示结果
:使用 OpenCV 的显示函数 cv2.imshow() 显示变换后的图像。
cv2.findHomography() 函数在图像处理和计算机视觉中具有广泛的应用,特别是在图像拼接、运动估计和增强现实等领域。
cv2.warpPerspective()函数介绍
cv2.warpPerspective() 是 OpenCV 库中的一个函数,用于对图像进行透视变换
。透视变换是指在图像的二维平面上进行投影变换,从而改变图的视角,类似于将图像从一个视点转换到另一个视点。
函数定义
cv2.warpPerspective(src, M, dsize, dst=None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
参数详解
- src: 输入图像,即需要进行透视变换的图像。它是一个多通道图像(如 BGR、灰度图等)。
- M: 3x3 变换矩阵,透视变换矩阵。这是由源图像和目标图像上的四个点计算得出的矩阵,可以使用 cv2.getPerspectiveTransform() 或 cv2.findHomography() 来获取。
- dsize: 输出图像的大小,格式为 (width, height)。定义了输出图像的尺寸。
- dst (optional): 输出图像,可以忽略,默认值为 None。
- flags (optional): 插值方法。常用的插值方法包括:
-
- cv2.INTER_NEAREST:最近邻插值
-
- cv2.INTER_LINEAR:双线性插值(默认值)
-
- cv2.INTER_CUBIC:双三次插值
- borderMode (optional): 边界模式,用于指定如何处理图像边界。常用模式有:
-
- cv2.BORDER_CONSTANT:填充边界值(默认值)
-
- cv2.BORDER_REPLICATE:复制边缘像素
- borderValue (optional): 当 borderMode 为 cv2.BORDER_CONSTANT 时使用的边界填充值,默认为 0。
示例代码
以下是一个使用 cv2.warpPerspective() 进行透视变换的示例代码:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg')
# 定义源图像中的四个点
pts_src = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])
# 定义目标图像中的四个点
pts_dst = np.array([[200, 150], [400, 150], [400, 300], [200, 300]])
# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(pts_src.astype(np.float32), pts_dst.astype(np.float32))
# 定义输出图像的大小
dsize = (500, 400)
# 进行透视变换
warped_image = cv2.warpPerspective(image, M, dsize)
# 显示结果
cv2.imshow('Warped Image', warped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个例子中,我们首先读取了一张图像,然后定义了源图像和目标图像中的四个点。
接着,我们使用 cv2.getPerspectiveTransform() 计算透视变换矩阵 M,并调用 cv2.warpPerspective() 进行变换。
最终,变换后的图像被显示出来。
透视变换在图像处理和计算机视觉中有广泛的应用,如图像校正、图像拼接和计算机视觉中的平面检测等。
xue