【详解之OpenCV中的findHomography()函数 和 cv2.warpPerspective()函数】

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)

参数说明

  1. srcPoints:源图像中的点集,类型为np.float32的N x 1 x 2或者N x 2数组(其中N是点的数量)。
  2. dstPoints:目标图像中的点集,类型和srcPoints相同,且点的数量和顺序需要与srcPoints一一对应。
  3. method:计算单应性矩阵的方法。可以是以下值之一:
    • cv2.RANSAC:基于RANSAC(Random Sample Consensus)算法的鲁棒方法(常用)。
    • cv2.LMEDS:最小中值鲁棒估计法。
    • 0:常规方法,使用所有点的最小二乘法,不推荐在有异常值时使用。
    • cv2.RHO:基于PROSAC的鲁棒方法。
  1. ransacReprojThreshold:仅在使用RANSAC方法时有用,表示一个点到对应点的投影之间的最大允许距离,以此来判断是否为内点(即,用于计算单应性矩阵的点)。这个阈值用于RANSAC算法中,单位是像素。
  2. mask:可选的输出掩码,将是一个8位单通道的数组,表示每个点是否为内点(用于计算单应性矩阵的点)。
  3. maxIters:RANSAC算法的最大迭代次数,默认值为2000。
  4. confidence:RANSAC算法中,模型被接受所需要的置信度(概率),默认值为0.995。
  5. refineMethod:用于优化单应性矩阵的方法,可以是cv2.LMEDS或cv2.RANSAC。
  6. 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()

解释

  1. 定义源点和目标点:在源图像和目标图像中定义四组对应的点。
  2. 计算单映射矩阵:使用 cv2.findHomography() 计算单映射矩阵 H。
  3. 应用透视变换:使用 cv2.warpPerspective() 函数和计算出的单映射矩阵 H 对源图像进行透视变换,从而将源图像中的对应点映射到目标图像中的位置。
  4. 显示结果:使用 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)

参数详解

  1. src: 输入图像,即需要进行透视变换的图像。它是一个多通道图像(如 BGR、灰度图等)。
  2. M: 3x3 变换矩阵,透视变换矩阵。这是由源图像和目标图像上的四个点计算得出的矩阵,可以使用 cv2.getPerspectiveTransform() 或 cv2.findHomography() 来获取。
  3. dsize: 输出图像的大小,格式为 (width, height)。定义了输出图像的尺寸。
  4. dst (optional): 输出图像,可以忽略,默认值为 None。
  5. flags (optional): 插值方法。常用的插值方法包括:
    • cv2.INTER_NEAREST:最近邻插值
    • cv2.INTER_LINEAR:双线性插值(默认值)
    • cv2.INTER_CUBIC:双三次插值
  1. borderMode (optional): 边界模式,用于指定如何处理图像边界。常用模式有:
    • cv2.BORDER_CONSTANT:填充边界值(默认值)
    • cv2.BORDER_REPLICATE:复制边缘像素
  1. 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

  • 34
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值