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
发表评论